Domanda

Questo piccolo errore SQL è bugging me. (?) Non sembra essere un problema con la query, solo il campo di applicazione, esempi funzionano meglio:

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 una colonna (gangs_ocs_process.membersin) che ha una lista di ID che hanno aderito (cioè 1,2,5). Sto cercando di ottenere i nomi utente per ciascuno di questi ID (dalla tabella users) in un colpo solo.

Il problema è LEFT JOIN users u ON u.userid IN ( ocp.membersin )

Se io substitue 1,2,4 a ocp.membersin (mettendo l'elenco letterale al posto del nome della colonna), funziona bene. Esso restituisce una colonna che ha i nomi utente ( immagine ). Tuttavia, se lascio nel ocp.membersin, ottengo questo errore:

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

Questa è la prima volta che ho anche usato in a sinistra si unisce quindi sono un po 'perso.

Qualsiasi aiuto sarebbe grande:)

È stato utile?

Soluzione

Non credo che "IN" lavorerà per questa sintassi. MySQL si aspetta IN di essere qualcosa di simile a un set di dati, non è una stringa delimitata. Penso che è necessario trovare un modo per prendere membersin, espanderla in un insieme di dati MySQL può lavorare con (forse una tabella temporanea), e di unirsi a questo.

Altri suggerimenti

Se avete delimitato le stringhe nella tabella, si dispone di un problema di progettazione nel database. Aggiungere una nuova tabella per contenere questi valori.

Sei sicuro 'membersin' è nella tabella 'gangs_ocs_process', e non la tabella '' gangs_ocs?

Il motivo non è possibile farlo funzionare è perché in primo luogo è necessario ottenere il vostro database normalizzato. Non si dovrebbe mai, mai avere un elenco di ID di in una singola colonna.

Dopo aver preso un altro sguardo, penso che il problema sta cercando di aggregare nel punto sbagliato, così come la sintassi IN e che si dovrebbe aggregare in una sottoquery limitata dal contenuto della IN. Non conosco abbastanza circa lo schema per rendere questo fuori dalla scatola giusta, ma si desidera qualcosa di simile. SomeKeyfield dovrebbe riguardare torna a gangs_ocs_process

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

Questo è un brutto modo per mantenere l'appartenenza.

Ma se hai ancora bisogno di vivere con essa, si può tentare di corrispondenza REGEXP per verificare l'appartenenza:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top