2016-11-16 11 views
-1

Ich versuche, die unterschiedlichen Werte in A mit Sitz in Zustand von Spalte BSQL Join nach Distinct

Das Problem, das ist, wenn ich alle, wird nicht die Bedingungen eingehalten werden.

Wenn ich nur den Wert, den ich möchte, unterscheiden, wird Spalte B Daten nicht verbunden.

Was habe ich versucht:

Abfrage A:

SELECT DISTINCT id_conversacion, convo_started, started_by, has_unread, pr_token, 
       hidden_started, hidden_recipiente, de_persona, para_persona, convo_perteneciente 
FROM cs_conversaciones 
INNER JOIN cs_privatemessages 
    ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion 
WHERE cs_privatemessages.de_persona = 123456 OR 
     cs_privatemessages.para_persona = 123456 
ORDER BY id_conversacion 

Ausgang (Didnt Typ alle Spalten outputed, nur ein Beispiel):

|id_conversacion|convo_started|started_by|has_unread|pr_token|...etc| 
--------------------------------------------------------------------- 
|1    | 2016-06-05 | 123456 |  0 | dd5f4 | 
|1    | 2016-06-05 | 123456 |  0 | 4fd85 | 
|2    | 2016-06-05 | 123456 |  0 | 8sa8s | 

Die outputed Spalten sind in Ordnung, aber der Unterschied (id_conversacion), der sich auf cs_privatemessages.convo_perteneciente beziehen sollte Wiederholungen (1, 1, 2)

Abfrage B:

SELECT DISTINCT id_conversacion 
FROM cs_conversaciones 
INNER JOIN cs_privatemessages 
    ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion 
WHERE cs_privatemessages.de_persona = 123456 OR 
     cs_privatemessages.para_persona= 123456 
ORDER BY id_conversacion 

Ausgang:

ich das Gegenteil bekommen, die deutliche ok, aber die ausgegebenen Spalten nicht.

|id_conversacion| 
----------------- 
|  1  | 
|  2  | 

Erwartetes Ergebnis (fehlende Spalten von join):

|id_conversacion|convo_started|started_by|has_unread|pr_token|de_persona|etc 
------------------------------------------------------------------------- 
|1    | 2016-06-05 | 123456 |  0 | dd5f4 | 123456 | 
|2    | 2016-06-05 | 123456 |  0 | 8sa8s | 126544 | 

Was mir, was die unterschiedlichen Wiederholungen macht, weil es in der Join-Tabelle mehr 1 Zeile ist.

+0

Was ist die Logik, die Sie führte eine der 'id_conversacion = 1 'Datensätze aus Ergebnismenge zu verwerfen? –

+0

'distinct' wirkt auf die gesamte Zeile, nicht auf eine einzelne Spalte und da sich der Wert in der Spalte' pr_token' ändert, erhalten Sie mehr Zeilen. Wenn Sie nur eine Zeile pro 'id_conversacion 'wollen, müssen Sie entscheiden, welchen pr_token-Wert Sie haben möchten (möglicherweise durch Anwenden von min/max und Gruppierung) – jpw

+0

DISTINCT gilt für die gesamten ausgewählten Zeilen. Wenn Sie jede id_conversacion nur einmal wollen, müssen Sie entscheiden, welche Werte für die anderen Spalten gewählt werden sollen. – jarlh

Antwort

0

Ich glaube, dass das, was Sie zu tun versuchen http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html

SELECT id_conversacion, convo_started, started_by, has_unread, pr_token, 
       hidden_started, hidden_recipiente, de_persona, para_persona, convo_perteneciente 
FROM cs_conversaciones 
INNER JOIN cs_privatemessages 
    ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion 
WHERE cs_privatemessages.de_persona = 123456 OR 
     cs_privatemessages.para_persona = 123456 
GROUP BY id_conversacion 
ORDER BY id_conversacion 

ist Gruppierung Aber Sie sollten Aggregationsfunktionen auf anderen Spalten oder in anderen Fällen wird es die erste Zeile Ergebnis

0

Gelöst verwenden.

Die Join-Tabelle wiederholt Wert zurückkehren:

einen MAX() und die Gruppe der Ausgabe durch gelöst Hinzufügen.

Abfrage:

SELECT DISTINCT id_conversacion, convo_started, started_by, has_unread, MAX(pr_token) as pr_token, hidden_started, hidden_recipiente, MAX(de_persona), MAX(para_persona), convo_perteneciente FROM cs_conversaciones INNER JOIN cs_privatemessages ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion WHERE cs_privatemessages.de_persona = 123456 OR cs_privatemessages.para_persona = 123456 GROUP BY id_conversacion,pr_token