Re: [php] & [mysql] select and subselect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 16 Nov 2009 14:21:41 -0800, Allen McCabe wrote:

> I have an order table that keeps track of the order_id, the date, the
> status, etc. I also have an order_lineitem table that is the contents of the
> order. This has a one-to-many structure (without foreign keys because it is
> mysql).

<http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html>

   "InnoDB supports foreign key constraints. ..."
 
> I was baffled as to how to filter the orders by the item_id that appears in
> the order_lineitem table.
> 
> I just came up with this, but I'm not sure how the mysql_queries will handle
> an array. Do I have to do some extensive regular expression management here
> to get this to work, or will it accept an array?
> 
> <?php
> 
> if (isset($_POST['showid']))
>    $showid = $_POST['showid'];
>    $subSQL = "SELECT order_id FROM afy_show_lineitem WHERE show_id =
> {$_POST['showid']};";
>    $subResult = mysql_query($subSQL);
>    $where = "WHERE";
>    $extQuery = 'order_id = {$subResult}';
>   }
> 
> $resultOrders = mysql_query("SELECT * FROM afy_order {$where} {$extQuery};")
> or die(mysql_error("Could not query the database!"));

[[ Note: You should probably have posted to the php-db list
   (or the php.db newsgroup) to increase the chance of
   getting responses from people who actually know what
   they're talking about. I'm a MySQL newbie... ]]


$subResult is a resource. You need to fetch the results
before you can use them like this. Maybe something like:

--------------------
  /* UNTESTED */

  /* Don't forget to escape! Some will argue that
     you are better off using prepared statements. */
  $showid = mysql_real_escape_string ($_POST['showid']);

  $q = <<<_
SELECT `order_id` FROM `afy_show_lineitem`
 WHERE `show_id` = '$showid';
_;

  $res = mysql_query ($q);
  if ($res) {
    while ($row = mysql_fetch_row ($res)) {
      $ids[] = $row[0]; /* Assuming numerical ids. */
    }
    $ids_spec = implode (',', $ids);
    mysql_free_result ($res);
  } else {
    /* Handle error */
  }

  if (isset ($ids_spec)) {
    $q = <<<_
SELECT * FROM `afy_order`
 WHERE `order_id` IN ($ids_spec)
_;
    $res = mysql_query ($q);
    if ($res) {
      /* Do stuff */
    } else {
      /* Handle error */
    }
  }
--------------------

But you could also do it in one query (*untested*):

  /* UNTESTED */

  SELECT `ao`.* FROM `afy_order`         AS `ao`,
                     `afy_show_lineitem` AS `asl`
   WHERE  `ao`.`show_id`  =  $show_id
     AND `asl`.`order_id` = `ao`.`show_id`


Or maybe there are better ways, such as using INNER JOIN,
but those sometimes end up using a temporary table...
(Hint: php-db, php.db, php-db, ...)


/Nisse

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux