2017-07-18 3 views
0

Hinweis: Dies ist kein Duplikat von: mySQL - Create a New Table Using Data and Columns from Three Tables. Bei dieser Frage geht es darum, Daten aus mehreren Tabellen zu übernehmen und tatsächlich eine neue Tabelle mit diesen Daten zu erstellen. Ich suche nur nach bereits vorhandenen Daten. Die Antwort auf diese Frage ist sehr spezifisch für die gestellte Frage und hilft mir nicht wirklich, da der Code in der Antwort nicht erklärt wird. Also nein, das ist nicht "genau die gleiche Frage".Kombinieren von Daten aus mehreren MySql-Tabellen in mehreren Zeilen in eine einzelne Zeile für eine SELECT-Anweisung

Ich habe eine Frage über die Verbindung von zwei MySQL-Tabellen, auf die ich keine Antwort finden kann. Die üblichen Arten von Joins scheinen nicht das zu sein, wonach ich suche. vielleicht ist das nicht möglich, da bin ich mir nicht sicher.

So habe ich meine erste Tabelle wie folgt aus (Tabellen zum Beispiel Zwecke vereinfacht):

ID Name Email    Phone 
1  John [email protected] 000-123-4567 
2  Jane [email protected] 000-890-1234 

Meine zweite Tabelle auf diese Weise angeordnet ist:

ID UserID meta_key   meta_value 
1 1   location_review  4 
2 1   condition_review 1 
3 1   price_review  5 
4 2   location_review  4 
5 2   condition_review 2 
6 2   price_review  4 

ich mit einigen bestehenden Software arbeite, Ich mache nur ein paar Modifikationen, also kann ich im Idealfall tun, was ich brauche, ohne zu ändern, wie die Software zu viel geschrieben ist.

Ich versuche, diese Tabellen verknüpfen zu können, so dass sie wie folgt aussehen:

ID Name Email    Phone   location_review condition_review price_review 
    1  John [email protected] 000-123-4567 4     1     5 
    2  Jane [email protected] 000-890-1234 4     2     4 

Also muss ich die Zeilen aus Tabelle 2 hinzufügen, die die Benutzer-ID an die Daten bereits in Tabelle 1 haben.

Da es sich um bestehende Software gibt es bereits einige Code in Ort, um diese zwei Tabellen zu verknüpfen, ist es hier:

SELECT * 
FROM wpnf_comments as comment 
    INNER JOIN wpnf_commentmeta AS meta 
WHERE comment.comment_post_ID = $prop_ID 
AND meta.meta_key = 'rating' 
AND meta.comment_id = comment.comment_ID 
AND (comment.comment_approved = 1 
    OR comment.user_id = $userID 
    ) 

Was ich tue, ist: Früher gab es nur eine einzige „Rating“ Wert sein, , in der Meta-Tabelle gespeichert. Sie können es in der oben genannten Verbindung sehen, wo es heißt:

AND meta.meta_key = 'rating' 

Allerdings versuche ich, das mit 3 separaten Bewertungen zu ersetzen. Der Join oben, der früher bei nur einer Bewertung funktionierte, funktioniert nicht wirklich, wenn ich mehrere Bewertungen habe.

Ich würde sehr schätzen jeden Einblick in, was ich tun muss, um dies zu beheben. Ich benutze auch PHP dafür, wenn das wichtig ist.

EDIT

Dies ist der Code, den ich bis jetzt haben. Es zeigt alle korrekten Spaltennamen, die ich jetzt brauche, aber die tatsächlichen Werte/Daten werden nicht angezeigt. Es gibt 0 Zeilen zurück.

SELECT 
    * 
FROM 
    wpnf_comments t1 
    INNER JOIN 
    (SELECT 
     comment_id as comment_id2, 
     MAX(IF(meta_key = 'location-rating', meta_value, NULL)) AS location_rating, 
     MAX(IF(meta_key = 'condition-rating', meta_value, NULL)) AS condition_rating, 
     MAX(IF(meta_key = 'maintenance-rating', meta_value, NULL)) AS maintenance_rating, 
     MAX(IF(meta_key = 'professionalism-rating', meta_value, NULL)) AS professionalism_rating, 
     MAX(IF(meta_key = 'contact-rating', meta_value, NULL)) AS contact_rating, 
     MAX(IF(meta_key = 'availability-rating', meta_value, NULL)) AS availability_rating, 
     MAX(IF(meta_key = 'responsiveness-rating', meta_value, NULL)) AS responsiveness_rating, 
     MAX(IF(meta_key = 'price-rating', meta_value, NULL)) AS price_rating 
    FROM 
     wpnf_commentmeta 
    GROUP BY comment_id) temp_t 
     ON t1.comment_post_ID = temp_t.comment_id2 
+0

Kann jemand bitte helfen Sie mir mit diesem? Ich habe jetzt mindestens zwei Stunden damit verbracht, ohne Glück. –

+0

Es wäre besser, wenn Sie [Normalisierung] (https://stackoverflow.com/questions/246701/what-is-normalization-or-normalization) in Ihrer relationalen Datenbank aufgrund der wiederkehrenden Meta_key-Werte verwenden würden. Dies würde bedeuten, dass Sie eine dritte Tabelle für Ihre Daten benötigen würden. Können Sie eine dritte Tabelle erstellen oder sind Sie nur auf diese beiden Tabellen beschränkt? – MinistryofChaps

+0

@MinistryofChaps die Software wird Daten in diese zwei vorhandenen Tabellen setzen, es sei denn, ich rekodiere ziemlich viel davon.Im Idealfall möchte ich nur diese beiden verwenden, sonst müsste ich ständig die dritte Tabelle mit den Daten aus diesen beiden Tabellen aktualisieren. –

Antwort

2

Benutzung von MySQL-Pivot-Tabellen

SELECT 
     temp_t.user_id, t1.Name, t1.Email, t1.Phone, temp_t.location_review, temp_t.condition_review, temp_t.price_review 
    FROM 
     table_1st t1 
     INNER JOIN 
     (SELECT 
      UserID as user_id, 
      MAX(IF(meta_key = 'location_review', meta_value, NULL)) AS location_review, 
      MAX(IF(meta_key = 'condition_review', meta_value, NULL)) AS condition_review, 
      MAX(IF(meta_key = 'price_review', meta_value, NULL)) AS price_review 
     FROM 
      table_2nd 
     GROUP BY UserID) temp_t 
      ON t1.ID = temp_t.user_id 
+0

Gibt es eine Möglichkeit, * so zu wählen, oder muss ich jedes Feld angeben? –

+0

Sie können SELECT * für die äußere SELECT-Anweisung verwenden. Dadurch werden alle Spalten von table_1st und die 4 Spalten der INNER SELECT-Abfrage angegeben. Aber dann ist user_id zweimal. –

+0

Ich komme diesem Code sehr nahe. In phpmyadmin, wenn ich den Code ausführen, habe ich die richtigen col-Namen, die ich jetzt anzeigen möchte :) Aber die Werte sind nicht, es gibt 0 Zeilen zurück. Es ist also ein Schritt in die richtige Richtung, da ich nun die benötigten Spalten habe, muss ich nur die Daten/Werte anzeigen lassen. –

Verwandte Themen