2017-09-14 2 views
1

Ich habe zwei TabellenVerwenden Mysql Spalte in Unterabfrage von subquery

Berichte

id  consultants 
1  1,2,3,4 

Benutzer

id name 
1  John 
2  Tom 

Wenn ich versuche, diese Abfrage ich einen Fehler auszuführen: „Unknown column ' reports.consultants 'in' Where-Klausel '"

SELECT reports.id, 
(SELECT GROUP_CONCAT(name SEPARATOR ", ") from (SELECT name from users where users.id in (reports.consultants)) a) as consultant 
FROM reports 

Ich habe überlegt, eine separate ReportConsultants-Tabelle zu verwenden, aber ich dachte, dass das Speichern der Berater in der Berichtstabelle die Abfrage effizienter machen und sich fragen könnte, ob es einen Weg dafür gibt. Die Verwendung dieser Art von Struktur ist auch im Code viel einfacher.

+1

Siehe sein. Oder stören Sie nicht mit einem RDBMS – Strawberry

+0

Vor allem das ist sehr schlechtes Design. –

+0

@Strawberry Wie empfehlen Sie zu entwerfen? – ykay

Antwort

1

Ja, es möglich ist, muss die Syntax etwas andere Normalisierung

SELECT reports.id, 
    (SELECT GROUP_CONCAT(name SEPARATOR ", ") from users where FIND_IN_SET(users.id, reports.consultants)) as consultant 
FROM reports 
0

Korrigieren Sie Ihre Datenstruktur! Sie sollten keine Listen von IDs in einer Zeichenfolge speichern. Hier sind einige Gründe:

  • Zahlen sollten als Zahlen, keine Zeichenfolgen gespeichert werden.
  • IDs sollten Fremdschlüsseleinschränkungen deklariert haben.
  • SQL-Stärke ist nicht String-Funktionen.

Der richtige Weg, um die Daten darzustellen, ist mit einer Verknüpfungstabelle,

create table ReportConsultants (
    ReportConsultantId int auto_increment primary key, 
    ReportId int, 
    ConsultantId, 
    constraint fk_reportconsults_report foreign key (reportid) references reports(reportid), 
    constraint fk_reportconsults_consultant foreign key (consultantid) references consultants(consultantid) 
); 
+0

Die erste Spalte ist (wahrscheinlich) redundant, aber wenn eine automatisch inkrementierende ID verwendet wird, muss sie als (eine Komponente von) einem PRIMARY KEY definiert werden. – Strawberry

+0

Ja, es ist definitiv ein Weg zu gehen. Ich dachte, mein Weg könnte die Abfrage schneller machen. Gibt es eine Möglichkeit, die Unterabfrage zur Verwendung des Feldes zu veranlassen? – ykay

+0

@ykay Ändern Sie Ihre Frage entsprechend. – Strawberry