2009-09-25 66 views
0

这是很难解释的选择,但我需要多个在一个声明中

- 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)。我怎么拉,从一排子行......

+1

我会尝试连接,但给予一定的表的模式,所以我们会知道 – 2009-09-25 16:42:31

回答

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); 

它的工作原理 - 这是可怕的。但它避免了稍后添加的关键字带来的许多问题。

+0

所有SQL数据库允许使用的关键词作为标识符,如果你在分隔符,这是按标准双引号,或背括起来在MySQL中,或MS SQL Server中的方括号。 – 2009-09-25 16:49:30

+0

是 - 同意(理论上)。 IDS允许CREATE TABLE语句写入(不是双引号),并且需要调整(在客户端环境中设置的环境变量)以接受分隔标识符。这是现实世界的变幻莫测。 (IDS的前身产品允许双引号等同于单引号 - 大约是SQL-86标准化的时间;我不确定是SQL-86还是SQL-89或SQL-92标准化分隔标识符,但是由于原因向后兼容性......)。 – 2009-09-25 22:05:50

0

您将在单个复合查询中得到的结果是一对多关系单端的重复字段值。所以,如果富:酒吧:: 1:大量然后根据查询得到所有的酒吧和他们的FOOS返回类似:

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

如果在其他表巴兹那就是酒吧地址:巴兹:: 1:地段,那么你得到这样的东西:

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字段相同的$持有者,并检查每次通过循环时新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'] 

}