2016-09-29 2 views
0

Bitte beachten Sie die folgenden Tabellen beitreten:MySQL auf drei Tabellen EAV Modell

Rechnungen

+-----------+----+------------+--------+---------+ 
| accountid | id | customerid | total | balance | 
+-----------+----+------------+--------+---------+ 
| 1   | 2 | 167909  | 120060 | 120060 | 
+-----------+----+------------+--------+---------+ 

invoices_attributes

+-----------+----+--------------+ 
| accountid | id | name   | 
+-----------+----+--------------+ 
| 1   | 1 | registration | 
+-----------+----+--------------+ 
| 1   | 2 | claimnumber | 
+-----------+----+--------------+ 
| 1   | 3 | jobid  | 
+-----------+----+--------------+ 

invoices_attributes_values ​​

+------------------+-------------+-----------+---------------+ 
| attributevalueid | attributeid | invoiceid | value   | 
+------------------+-------------+-----------+---------------+ 
| 1    | 1   | 2   | ABC 126L  | 
+------------------+-------------+-----------+---------------+ 
| 2    | 2   | 2   | ABZ123  | 
+------------------+-------------+-----------+---------------+ 
| 3    | 3   | 2   | MARY DOE  | 
+------------------+-------------+-----------+---------------+ 

Durch die Hilfe von Eugen Rieck's ursprüngliche Antwort konnte ich die folgende Abfrage

SELECT 
    invoices.accountid, 
    invoices.id AS invoiceid, 
    invoices.customerid, 
    invoices.total, 
    registration.value AS registration, 
    claimnumber.value AS claimnumber, 
    jobid.value as jobid 
    FROM 
    invoices 
    LEFT JOIN invoice_attributes ON invoices.accountid=invoice_attributes.accountid 
    LEFT JOIN invoice_attribute_values AS registration ON registration.attributeid = invoice_attributes.id AND invoices.id = registration.invoiceid AND invoice_attributes.name = 'registration' 
    LEFT JOIN invoice_attribute_values AS claimnumber ON claimnumber.attributeid = invoice_attributes.id AND invoices.id = claimnumber.invoiceid AND invoice_attributes.name = 'claimnumber' 
    LEFT JOIN invoice_attribute_values AS jobid ON jobid.attributeid = invoice_attributes.id AND invoices.id = jobid.invoiceid AND invoice_attributes.name = 'jobid' 

Welche das folgende Ergebnis gab machen

+-----------+-----------+------------+--------+--------------+-------------+----------+ 
| accountid | invoiceid | customerid | total | registration | claimnumber | jobid | 
+-----------+-----------+------------+--------+--------------+-------------+----------+ 
| 1   | 2   | 167909  | 120060 | NULL   | NULL  | MARY DOE | 
+-----------+-----------+------------+--------+--------------+-------------+----------+ 
| 1   | 2   | 167909  | 120060 | NULL   | ABZ123  | NULL  | 
+-----------+-----------+------------+--------+--------------+-------------+----------+ 
| 1   | 2   | 167909  | 120060 | ABC 126L  | NULL  | NULL  | 
+-----------+-----------+------------+--------+--------------+-------------+----------+ 

Als ich GROUP BY einige der invoices.id Spalten (registration, claimnumner oder job) werden NULL. Ich wünsche das Ergebnis zu sein als:

Wie kann die Abfrage geändert werden, um das Ergebnis oben zu erhalten?

Antwort

0

SQL verfügt nicht über die Möglichkeit, die Spalten von den Daten abhängig zu machen. Sie könnten jedoch eine Abfrage mit allen möglichen Eigenschaften entlang der Linien von

Im Grunde erstellen Sie eine EVA-Struktur renormieren - das ist natürlich möglich:

SELECT 
    invoices.accountid, 
    invoices.id AS invoiceid 
    invoices.customerid, 
    invoices.total, 
    jobids.value AS jobid -- one of these lines per attriubute 
FROM 
    invoices 
    LEFT JOIN invoices_attributes ON invoices.accountid=invoices_attributes.accountid 
    -- One of the following joins per attribute 
    LEFT JOIN invoices_attributes_values AS jobids 
    ON jobids.attr_id=invoices_attributes.attr_id 
    AND jobids.accountid=invoices.accountid 
    AND jobids.invoiceid=invoices.id 
    AND invoices_attributes.attr_name='jobid' 
+0

@Eugene: Ich aktualisiert habe die Frage mit einem tatsächlichen Abfrage und es ist Ergebnisse. Ich denke, eine kleine Änderung daran und es könnte funktionieren? –