无重复值的MySQL连接查询 发票表 发票内容表 此联接查询

无重复值的MySQL连接查询 发票表 发票内容表 此联接查询,mysql,Mysql,给出了这个结果 | id | fname | item | price | quantity | discount | total | gtotal | |----|---------|------------|-------|----------|----------|-------|--------| | 1 | Brandon | Dextrose | 10 | 10 | 5 | 95 | 860 | | 1 |

给出了这个结果

 | id |   fname |       item | price | quantity | discount | total | gtotal |
 |----|---------|------------|-------|----------|----------|-------|--------|
 |  1 | Brandon |   Dextrose |    10 |       10 |        5 |    95 |    860 |
 |  1 | Brandon |   Nescaine |    20 |       30 |       10 |   540 |    860 |
 |  1 | Brandon | Anticavity |    30 |       10 |       25 |   225 |    860 |
| id |   fname |       item | price | quantity | discount | total | gtotal |
|----|---------|------------|-------|----------|----------|-------|--------|
|  1 | Brandon |   Dextrose |    10 |       10 |        5 |    95 |    860 |
|    |         |   Nescaine |    20 |       30 |       10 |   540 |        |
|    |         | Anticavity |    30 |       10 |       25 |   225 |        |
我需要这个结果

 | id |   fname |       item | price | quantity | discount | total | gtotal |
 |----|---------|------------|-------|----------|----------|-------|--------|
 |  1 | Brandon |   Dextrose |    10 |       10 |        5 |    95 |    860 |
 |  1 | Brandon |   Nescaine |    20 |       30 |       10 |   540 |    860 |
 |  1 | Brandon | Anticavity |    30 |       10 |       25 |   225 |    860 |
| id |   fname |       item | price | quantity | discount | total | gtotal |
|----|---------|------------|-------|----------|----------|-------|--------|
|  1 | Brandon |   Dextrose |    10 |       10 |        5 |    95 |    860 |
|    |         |   Nescaine |    20 |       30 |       10 |   540 |        |
|    |         | Anticavity |    30 |       10 |       25 |   225 |        |

我只是MySQL的初学者。从今天早上开始,我一直在尝试通过不同的组合来获得这种输出,请帮助我。

@Rex,您的选择是正确的。您应该使用一些脚本(例如PHP)生成所需的输出。

在SQL中尝试以下操作:

在这个查询中,我每次保存变量中的fname都不相等,在下一行比较它并返回一个空字符串is it equal。gtotal也一样

交叉联接仅用于初始化变量

在这种情况下,按fname对行进行排序非常重要,以确保相同的名称位于彼此后面

SELECT
    invoice.id,
    IF(@last_fname = invoice.fname, '', (@last_fname:=invoice.fname)) as fname,
    invoice_contents.item,
    invoice_contents.price,
    invoice_contents.quantity,
    invoice_contents.discount,
    IF(@last_gtotal = invoice.gtotal, '', (@last_gtotal:=invoice.gtotal)) as gtotal
FROM invoice_contents
INNER JOIN invoice ON invoice_contents.invoice_id=1 AND invoice.id=1
CROSS JOIN ( select @last_fname := '' , @last_gtotal := '' ) AS parameter
ORDER BY invoice.fname;
样本

MariaDB [bb]> SELECT
    ->     invoice.id,
    ->     IF(@last_fname = invoice.fname, '', (@last_fname:=invoice.fname)) AS fname,
    ->     invoice_contents.item,
    ->     invoice_contents.price,
    ->     invoice_contents.quantity,
    ->     invoice_contents.discount,
    ->     IF(@last_gtotal = invoice.gtotal, '', (@last_gtotal:=invoice.gtotal)) AS gtotal
    -> FROM invoice_contents
    -> INNER JOIN invoice ON invoice_contents.invoice_id=1 AND invoice.id=1
    -> CROSS JOIN ( SELECT @last_fname:='' , @last_gtotal:='' ) AS parameter
    -> ORDER BY invoice.fname;
+----+---------+------------+-------+----------+----------+--------+
| id | fname   | item       | price | quantity | discount | gtotal |
+----+---------+------------+-------+----------+----------+--------+
|  1 | Brandon | Dextrose   | 10.00 |       10 |     5.00 | 860.00 |
|  1 |         | Nescaine   | 20.00 |       30 |    10.00 |        |
|  1 |         | Anticavity | 30.00 |       10 |    25.00 |        |
+----+---------+------------+-------+----------+----------+--------+
3 rows in set, 1 warning (0.00 sec)

MariaDB [bb]>

SQL Fiddle:奇怪的是,这些表之间不存在任何关系。但是,从另一方面讲,您混淆了数据检索和数据显示——后者在应用程序级代码(例如,一个简单的php循环)中得到更恰当的解决,尽管在MySQL中没有明确设置,通过将与发票表中的id字段相同的编号分配给发票内容表的发票id字段(提供:php的mysqli_insert_id)来创建这种关系,这也是我的直觉。这最终是针对PHP MySQL应用程序的。因为原始海报是初学者,我可以向您推荐这个答案来解释发生了什么吗?谢谢。在SQLFIDLE demo中运行查询将显示所需的输出。但是在我使用mysql cli和adminer.php(类似于phpmyadmin)的wamp设置中,我得到了重复的结果values@Rex-您可以发布一些outputWorking SQL FIDLE:不是预期的输出-在MySQL CLI中运行了相同的查询,但得到了此输出。在我的Linux LAMP设置中也进行了尝试,得到了相同的结果
MariaDB [bb]> SELECT
    ->     invoice.id,
    ->     IF(@last_fname = invoice.fname, '', (@last_fname:=invoice.fname)) AS fname,
    ->     invoice_contents.item,
    ->     invoice_contents.price,
    ->     invoice_contents.quantity,
    ->     invoice_contents.discount,
    ->     IF(@last_gtotal = invoice.gtotal, '', (@last_gtotal:=invoice.gtotal)) AS gtotal
    -> FROM invoice_contents
    -> INNER JOIN invoice ON invoice_contents.invoice_id=1 AND invoice.id=1
    -> CROSS JOIN ( SELECT @last_fname:='' , @last_gtotal:='' ) AS parameter
    -> ORDER BY invoice.fname;
+----+---------+------------+-------+----------+----------+--------+
| id | fname   | item       | price | quantity | discount | gtotal |
+----+---------+------------+-------+----------+----------+--------+
|  1 | Brandon | Dextrose   | 10.00 |       10 |     5.00 | 860.00 |
|  1 |         | Nescaine   | 20.00 |       30 |    10.00 |        |
|  1 |         | Anticavity | 30.00 |       10 |    25.00 |        |
+----+---------+------------+-------+----------+----------+--------+
3 rows in set, 1 warning (0.00 sec)

MariaDB [bb]>