Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL Join Query without duplicate values

Tags:

mysql

  1. invoice table
 SELECT id, fname, gtotal, `date` FROM invoice WHERE id = 1;


| id |   fname | gtotal |                  date |
|----|---------|--------|-----------------------|
|  1 | Brandon |    860 | May, 11 2016 00:00:00 |
  1. invoice_contents table,
SELECT * FROM invoice_contents WHERE invoice_id = 1;


| id | invoice_id |       item | price | quantity | discount | total |
|----|------------|------------|-------|----------|----------|-------|
|  1 |          1 |   Dextrose |    10 |       10 |        5 |    95 |
|  2 |          1 |   Nescaine |    20 |       30 |       10 |   540 |
|  3 |          1 | Anticavity |    30 |       10 |       25 |   225 |
  1. This JOIN query
SELECT invoice.id, invoice.fname, invoice_contents.item,
       invoice_contents.price, invoice_contents.quantit,
       invoice_contents.discount, invoice_contents.total, 
       invoice.gtotal
  FROM invoice_contents
 INNER JOIN invoice ON invoice_contents.invoice_id=1 AND invoice.id=1;

gives this result.

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

I need this result.

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

I am just a beginner in MySQL. I have been trying from this morning to get this kind of output by experimenting on different combinations please help me out.

like image 760
Rex Avatar asked Feb 16 '26 19:02

Rex


2 Answers

@Rex, Your select is correct. You should make desired output using some script e.g. PHP.

like image 55
Taras Avatar answered Feb 19 '26 00:02

Taras


try this in SQL:

in this Query i save everytime fname in a variable is not equal and at the next row i compare it and return a empty string is it equal. and the same for gtotal.

the cross join is only to initialize the variables.

in this case it is important that the rows are order by fname to ensure that the same name is behind each other

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;

Sample

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]>
like image 38
Bernd Buffen Avatar answered Feb 19 '26 00:02

Bernd Buffen



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!