这很难解释,但我需要
- 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)。我如何从行中拉出子行......
答案 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']
}