SQL 复杂连接
SQL Complexed Join
我想通过下表列出客户的购买记录。
Table: Invoice
----------------------
invID | cusID | total
----------------------
1 | 1 | 10.5
Table: Invoice Item
--------------------
invID | prodID
---------------
1 | 1
1 | 3
现在我想像这样输出一行:(或在PHP获取的行表中)
invID | cusID | prodID | total
-------------------------------
1 | 1 | 1, 3 | 10.5
我尝试了什么:
SELECT i.*, ii.prodID FROM invoice i, invoiceitem ii WHERE cusID = '1' AND i.invID = ii.invID
Result:
invID | cusID | prodID | total
-------------------------------
1 | 1 | 1 | 10.5
1 | 1 | 3 | 10.5
我认为这对你有用。还没有测试过,所以某处可能有一个小错字,但这个概念应该可行。
SELECT i.invID, i.cusID, GROUP_CONCAT(ii.prodID) `prodID`, i.total
FROM invoice i
INNER JOIN invoiceitem ii ON i.invID = ii.invID
GROUP BY i.invID
您只是在 prodID
上漏了一个 GROUP_CONCAT。您还应该使用 ANSI INNER JOIN 语法,而不是加入 WHERE 子句。尽管 MySql 没有抱怨,但在 GROUP BY 中包含所有非聚合的 select 字段也是一种很好的做法,以符合其他 RDBMS 的
SELECT i.invID, i.cusID, GROUP_CONCAT(ii.prodID) as prodID, i.total
FROM invoice i INNER JOIN invoiceitem ii ON i.invID = ii.invID
WHERE cusID = '1'
GROUP BY i.invID, i.cusID, i.total;
我想通过下表列出客户的购买记录。
Table: Invoice
----------------------
invID | cusID | total
----------------------
1 | 1 | 10.5
Table: Invoice Item
--------------------
invID | prodID
---------------
1 | 1
1 | 3
现在我想像这样输出一行:(或在PHP获取的行表中)
invID | cusID | prodID | total
-------------------------------
1 | 1 | 1, 3 | 10.5
我尝试了什么:
SELECT i.*, ii.prodID FROM invoice i, invoiceitem ii WHERE cusID = '1' AND i.invID = ii.invID
Result:
invID | cusID | prodID | total
-------------------------------
1 | 1 | 1 | 10.5
1 | 1 | 3 | 10.5
我认为这对你有用。还没有测试过,所以某处可能有一个小错字,但这个概念应该可行。
SELECT i.invID, i.cusID, GROUP_CONCAT(ii.prodID) `prodID`, i.total
FROM invoice i
INNER JOIN invoiceitem ii ON i.invID = ii.invID
GROUP BY i.invID
您只是在 prodID
上漏了一个 GROUP_CONCAT。您还应该使用 ANSI INNER JOIN 语法,而不是加入 WHERE 子句。尽管 MySql 没有抱怨,但在 GROUP BY 中包含所有非聚合的 select 字段也是一种很好的做法,以符合其他 RDBMS 的
SELECT i.invID, i.cusID, GROUP_CONCAT(ii.prodID) as prodID, i.total
FROM invoice i INNER JOIN invoiceitem ii ON i.invID = ii.invID
WHERE cusID = '1'
GROUP BY i.invID, i.cusID, i.total;