4 Stimmen

MySQL Benötigt Hilfe bei der Erstellung einer Abfrage: Mehrere Tabellen in einer einzigen Zeile verbinden

Verzeihen Sie mir, wenn diese Frage bereits gestellt und beantwortet wurde, ich habe gesucht und einige gefunden, die ähnlich aussehen, aber ich bin zu sehr ein Anfänger mit SQL, um sie an meine Bedürfnisse anzupassen. Verzeihen Sie mir auch, wenn ich nicht die richtige Terminologie verwende. Ich weiß, dass es ärgerlich sein kann, wenn jemand eine Frage stellt und nicht einmal genug weiß, um nach dem zu fragen, was er braucht.

<2. EDIT Mar22:>

Ok, ich habe nicht verstanden, wie die Quelldaten tatsächlich aussehen, und deshalb konnte ich nicht bekommen, was ich wollte. Danke an @goran, der mich dazu gedrängt hat, die echten Quelltabellen hier zu posten (die ich immer noch nicht posten werde, weil ich zu faul bin, sie für eine einfache Ansicht und zum Schutz der Unschuldigen zu schwärzen, aber ich hätte sie wenigstens ausdrucken sollen, bevor ich gefragt habe). Nachfolgend finden Sie neu überarbeitete Beispieltabellen, aber ich habe immer noch nicht herausgefunden, wie ich das Endziel erreichen kann, alles in eine einzige Zeile zu bekommen.

table_one:

id  name          total
5   John Doe      20

Tabelle_zwei:

id  product_id    price
5   51            17

table_three:

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

Was ich suche, ist so etwas wie das hier:

id name     total product_id price text     number text number text   number
5  John Doe 20    51         17    Subtotal 17     Tax  3      Total  20

Ich bin mir nicht mehr sicher, inwieweit die nachstehenden Informationen zutreffend sind, aber ich lasse sie hier stehen, in der Hoffnung, dass sie neue Leser der Frage nicht zu sehr verwirren.

</EDIT 22. März>

Ich helfe einem Freund, einige Daten zu sammeln, und muss eine Abfrage durchführen, die eine einzelne Zeile pro Datensatz ergibt, aber stattdessen erhalte ich mehrere Zeilen. Hier ist ein Beispiel dafür, was ich gerade abfrage (vereinfacht, hoffentlich nicht zu sehr):

SELECT * FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3 ON t1.id = t3.id 
WHERE 1

Das Ergebnis ist:

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

Was ich brauche, ist eine Abfrage, die in etwa so aussieht:

id  text       number  text  number  text   number
5   subtotal   17      Tax   3       Total  20

Für jede Hilfe/Anleitung wären wir sehr dankbar.

Danke!

--jed

4voto

Unreason Punkte 12300

Ich glaube, Sie haben es irgendwo zu sehr vereinfacht. Die von Ihnen zitierte Abfrage würde genau das zurückgeben, was Sie bereits wollen. Hier ist ein Beispiel (zweimalige Auswahl aus einer einzigen Tabelle ergibt eine ähnliche Situation wie die von Ihnen beschriebene)

mysql> select * from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+------+------+------+------+
| a    | b    | a    | b    |
+------+------+------+------+
|    1 |    2 |    1 |    1 | 
|    1 |    1 |    1 |    2 | 
|    1 |    2 |    1 |    2 | 
|    2 |    2 |    2 |    2 | 
|    2 |    2 |    2 |    2 | 
+------+------+------+------+
5 rows in set (0.00 sec)

Mysql hat kein Problem, die Spalten der Ergebnismenge mit denselben Bezeichnungen zu versehen. Ich vermute, dass Ihre ursprüngliche Abfrage select t1.* im select-Teil hatte.

Wenn Sie sich auf einzelne Felder beziehen wollen, deren Namen mehrdeutig sind, erhalten Sie

mysql> select a from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
ERROR 1052 (23000): Column 'a' in field list is ambiguous

Und Sie müssen genau angeben, was Sie wollen (Spalten-Aliase sind optional, Sie können t1. , t2. auch)

mysql> select t1.a first, t2.a second from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+-------+--------+
| first | second |
+-------+--------+
|     1 |      1 | 
|     1 |      1 | 
|     1 |      1 | 
|     2 |      2 | 
|     2 |      2 | 
+-------+--------+
5 rows in set (0.00 sec)

22MAR bearbeiten Nach einer Änderung in den Beispieldaten scheint es, dass Sie mehrere Zeilen aus einer Tabelle in eine Tabelle umwandeln wollen. Hier ist eine besondere Lösung (unter der Annahme, dass Sie immer Steuer-, Gesamt- und Zwischensummenzeilen haben werden und dass Sie nur an diesen Zeilen interessiert sind).

SELECT t1.id, t1.name, t2.product_id, t2.price, t3a.number subtotal, t3b.number total, t3c.number tax
FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3a ON t1.id = t3a.id and t3a.text = "Subtotal"
INNER JOIN `table_three` AS t3b on t3a.id = t3b.id and t3b.text = "Total"
INNER JOIN `table_three` AS t3c on t3b.id = t3c.id and t3c.text = "Tax"

(wenn Sie möchten, können Sie auch die Konstanten "Tax", "Total" und "Subtotal" im Select-Teil auswählen und ihnen Spaltennamen geben)

Eine Sache, die unklar bleibt, ist die Beziehung zwischen den IDs in den Tabellen - sind sie Primärschlüssel von table_one oder table_two. Das kann natürlich die Ergebnisse beeinflussen, wenn Sie mehrere Zeilen in table_one und table_two haben.

1voto

Li0liQ Punkte 10890

Sie werden nicht in der Lage sein, Ihr Ergebnis genau so zu erhalten, wie Sie es wünschen, zumindest weil Sie Spalten mit denselben Namen haben. Möglicherweise können Sie das Ergebnis erhalten, indem Sie die Spalten umbenennen, aber dieser Ansatz führt zu hakeligem Code und der Unfähigkeit, das Ergebnis richtig zu verwenden.

Sie sollten die weitere Verwendung der zurückgegebenen Datensätze überdenken und sie aktualisieren, um das tatsächliche Ergebnis zu verarbeiten, sobald es der Weg ist SQL select sollte normalerweise Daten zurückgeben.

1voto

bignose Punkte 27108

Die Ausgabe, nach der Sie fragen ist keine Beziehung da seine Attribute keine eindeutigen Namen haben. Es ist also unzumutbar, von einem relationalen Datenbanksystem ein solches Ergebnis zu erwarten. Was nicht heißen soll, dass einige Datenbanksysteme in der Lage sind Pause das relationale Modell und produzieren in einigen Fällen nicht-relationale Ergebnisse; aber dies ist wahrscheinlich nicht einer von ihnen sein.

Sie sollten also stattdessen die Die Anwendung nimmt die Beziehung als Eingabe und wandelt sie in die gewünschte Ausgabe um . Aus der RDBMS-Perspektive ist das ein wichtiger Teil der Rolle der Anwendung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X