Frage

Diese kleinen SQL-Fehler nerven mich. (?) Es scheint nicht ein Problem mit der Abfrage zu sein, nur der Umfang, die Beispiele am besten funktionieren:

SELECT ocp.*, oc.*, GROUP_CONCAT( u.username SEPARATOR ', ') AS `memjoined`
FROM gangs_ocs_process ocp, gangs_ocs oc
LEFT JOIN users u ON u.userid IN ( ocp.membersin )
WHERE ocp.ocid =1 AND ocp.gangid =1 AND oc.oc_name = ocp.crimename
GROUP BY ocp.ocid
LIMIT 0 , 30 

Theres eine Säule (gangs_ocs_process.membersin), die eine Liste von IDs hat, die beigetreten sind (dh 1,2,5). Ich versuche, die Benutzernamen für jede dieser IDs zu erhalten (von der users Tabelle) in einem Rutsch.

Das Problem ist LEFT JOIN users u ON u.userid IN ( ocp.membersin )

Wenn ich 1,2,4 in für ocp.membersin substitue (die wörtliche Liste anstelle von Spaltennamen setzen), funktioniert es ok. Es gibt eine Spalte, die die Benutzernamen ( Bild ) aufweist. Allerdings, wenn ich in der ocp.membersin verlassen, bekomme ich diesen Fehler:

#1054 - Unknown column 'ocp.membersin' in 'on clause'

Dies ist das erste Mal, dass ich auch in der linken verwende IN habe Joins so bin ich ein wenig verloren.

Jede Hilfe wäre toll:)

War es hilfreich?

Lösung

Ich glaube nicht, dass „IN“ wird für diese Syntax arbeiten. MySQL erwartet IN so etwas wie einen Datensatz, nicht begrenzten Zeichenfolge zu sein. Ich glaube, Sie müssen einen Weg finden, membersin zu nehmen, erweitern sie in einen Datensatz kann MySQL arbeiten mit (vielleicht einer temporären Tabelle), und kommen auf dem.

Andere Tipps

Wenn Sie Zeichenfolgen in der Tabelle begrenzt haben, haben Sie ein Design-Problem in Ihrer Datenbank. Fügen Sie eine neue Tabelle, die diese Werte zu halten.

Sind Sie sicher, dass 'membersin' in dem 'gangs_ocs_process' Tisch, und nicht die 'gangs_ocs' Tabelle?

Der Grund, warum Sie nicht, dass es an der Arbeit, weil zuerst müssen Sie Ihre Datenbank NORMALIZED bekommen. Sie sollten sich nicht, jemals eine Liste von IDs in einer einzigen Spalte.

Nachdem er eine anderen Blick nehmen, ich denke, das Problem an der falschen Stelle zu aggregieren versucht, als auch die in der Syntax und dass Sie eine Unterabfrage durch den Inhalt des IN beschränkt aggregieren sollen. Ich weiß nicht genug über Ihr Schema dies aus dem Kasten heraus richtig zu machen, aber Sie wollen so etwas wie diese. SomeKeyfield sollte gangs_ocs_process beziehen zurück

SELECT ocp.*, oc.*, u.Memjoined
FROM gangs_ocs_process ocp, gangs_ocs oc
LEFT JOIN (Select SomeKeyField, GROUP_CONCAT( u.username SEPARATOR ', ') as memjoined
            from  users where userid in
            (select membersin from gangs_ocs_process 
             where [whatever conditions] )
             Group By SomeKeyField) u on ocp.SomeKeyField = u.SomeKeyField

WHERE ocp.ocid =1 AND ocp.gangid =1 AND oc.oc_name = ocp.crimename
GROUP BY ocp.ocid
LIMIT 0 , 30

Dies ist ein schlecht halten Mitgliedschaft.

Aber wenn Sie immer noch mit ihnen leben müssen, können Sie REGEXP passende versuchen, für die Mitgliedschaft zu testen:

SELECT ocp.*, oc.*, GROUP_CONCAT( u.username SEPARATOR ', ') AS `memjoined`
FROM gangs_ocs_process ocp
LEFT JOIN users u ON (ocp.membersin RLIKE CONCAT('(^|,)[[:blank:]]?', userid, '[[:blank:]]?($|,)'))
JOIN gangs_ocs oc ON (ocp.ocid = 1 AND ocp.gangid = 1 AND oc.oc_name = ocp.crimename)
GROUP BY ocp.ocid
LIMIT 0 , 30
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top