在MySQL查询中组合多行

时间:2012-06-14 15:07:10

标签: php mysql

所以我有2张桌子,发票和发票项目。我想创建一个查询,将两者合并为一个报表表。我遇到的问题是我的查询只返回tblinvoiceitems的第一行,而不是所有适用的。请参阅下面的代码。谢谢!

以下是表格:

invoices
+------+----------+-------------+-------------+------------+----------+-------+---------+
|  id  |  userid  |   duedate   |  datepaid   |  subtotal  |  credit  |  tax  |  total  |
+------+----------+-------------+-------------+------------+----------+-------+---------+
| 662  | 436      | 2012-07-01  | 2012-06-05  | 1290.00    | 0.00     | 0.00  | 1290.00 |
+------+----------+-------------+-------------+------------+----------+-------+---------+
| 668  | 441      | 2012-07-01  | 2012-06-11  | 1290.00    | 0.00     | 0.00  | 1290.00 |
+------+----------+-------------+-------------+------------+----------+-------+---------+

invoiceitems
+------+-------------+----------+----------+---------+-----------------+----------+
|  id  |  invoiceid  |  userid  |   type   |  relid  |   description   |  amount  |
+------+-------------+----------+----------+---------+-----------------+----------+
| 1408 | 662         | 436      | Promo    | 436     | Setup Fee       | 295.00   |
+------+-------------+----------+----------+---------+-----------------+----------+
| 1409 | 662         | 436      |          | 0       | US Standard     | 995.00   |
+------+-------------+----------+----------+---------+-----------------+----------+
| 1425 | 668         | 441      | Promo    | 441     | Setup Fee       | 295.00   |
+------+-------------+----------+----------+---------+-----------------+----------+
| 1426 | 668         | 441      |          | 0       | US Standard     | 995.00   |
+------+-------------+----------+----------+---------+-----------------+----------+

我想要的表格:

newtable
+------+----------+-------------+-------------+-------------+---------+-----------+------------+
|  id  |  userid  |  invoiceid  |   duedate   |  datepaid   |  setup  |  hosting  |  subtotal  |
+------+----------+-------------+-------------+-------------+---------+-----------+------------+
| 1    | 436      | 662         | 2012-07-01  | 2012-06-05  | 295.00  | 995.00    | 1290.00    |
+------+----------+-------------+-------------+-------------+---------+-----------+------------+
| 2    | 441      | 668         | 2012-07-01  | 2012-06-11  | 295.00  | 995.00    | 1290.00    |
+------+----------+-------------+-------------+-------------+---------+-----------+------------+

当前查询:

"INSERT INTO newtable SELECT
tblinvoices.id,
tblinvoices.userid,
tblinvoices.duedate,
tblinvoices.datepaid,
tblinvoices.subtotal,
tblinvoiceitems.invoiceid,
tblinvoiceitems.amount
FROM tblinvoices
INNER JOIN tblinvoiceitems ON tblinvoices.id = tblinvoiceitems.invoiceid";

2 个答案:

答案 0 :(得分:0)

使用distinct,2 LEFT JOIN和WHERE子句的组合。

SELECT DISTINCT <***>
LEFT JOIN invoiceitems ii0 ON ii0.id=i.invoiceid
LEFT JOIN invoiceitems ii1 ON ii1.id=i.invoiceid
WHERE ii0.description = 'Setup Fee'
  ANN ii1.description = 'US Standard'

此外,您最好为描述和descriptionInvoiceItemRelation表创建单独的表。

http://en.wikipedia.org/wiki/Database_normalization

答案 1 :(得分:0)

您可以尝试:

SELECT 
  i.id AS InvoiceID, i.userid, ii.invoiceid, i.duedate, 
  i.datepaid, i.setup, i.hosting, i.subtotal
FROM
  invoices i 
INNER JOIN 
  invoiceitems ii ON i.id = ii.id