多个选择在一个语句中

时间:2009-09-25 16:37:50

标签: php mysql syntax

这很难解释,但我需要

- select id from customers
- foreach customer find the order with that id
-- foreach order (for that customer)
--- select product.name, product.max on order.productId=product.id

我不知道如何提取这些数据。我需要多个单独的选择?我可以编写一个长的单个sql语句(';'计为单独的:P)。我如何从行中拉出子行......

2 个答案:

答案 0 :(得分:4)

使用联接:

SELECT c.id, o.id, p.name, p.max
  FROM Customers AS c
       JOIN Orders AS o ON c.id = o.customer
       JOIN Product AS p ON o.productID = p.id

更有可能的是,你有一个Orders表和一个OrderItems表 - 只需在适当的条件下添加额外的JOIN级别。

请注意,我假设您的表格为“订单”,以避免与关键字“订单”冲突。我没想到你从MAX函数中消除了Product.Max的歧义。您可能不得不担心DBMS允许的内容(有些人容忍滥用关键字;有些则不然)。


容忍(过度容忍)DBMS是IBM Informix Dynamic Server(IDS):

CREATE TABLE table(null INTEGER, integer CHAR(3), date DECIMAL(10,0), decimal DATE);

它有效 - 它很可怕。但它避免了以后添加关键字的许多问题。

答案 1 :(得分:0)

在单个复合查询中,您将获得的是一对多关系的单端的重复字段值。因此,如果Foo:Bar :: 1:lot然后作为查询获得所有Bars和他们的Foos返回类似于:

foo1 bar1
foo1 bar2
foo1 bar3
foo2 bar4
foo2 bar17
foo3 bar78

如果你添加另一个表Baz是Bar:Baz :: 1:lots,那么你会得到这样的结果:

foo1 bar1 baz1
foo1 bar1 baz2
foo1 bar1 baz3
foo1 bar2 baz15
foo1 bar3 baz32
foo1 bar3 baz33
foo2 bar4 baz17
foo2 bar17 baz21
foo3 bar78 baz7

这正是SQL应该做的事情。但是,当您尝试以漂亮的格式输出答案时,它会出现一些问题。这就是你的应用程序代码所在的位置。设置一个等于foo字段的$ holder,并检查每次通过循环时新foo是否与旧foo不同。用$ bar做同样的事情。所以:

$fooholder=NULL;
$barholder=NULL;
foreach ($result as $row_array) {
  if(empty($fooholder)) {
    $fooholder=$row_array['foo'];
    $barholder=$row_array['bar'];
  }

  if ($fooholder!=$row_array['foo']){ //new foo value, so next section
     //output $row_array['foo'] since it's new
     $fooholder=$row_array['foo'];
  }

  if ($barholder!=$row_array['bar']){ //new bar value, so next section
     //output $row_array['bar'] since it's new
     $barholder=$row_array['bar'];
  }

  //output $row_array['baz']

}