Pergunta

Este erro SQL pequena está me incomodando. (?) Não parece ser um problema com a consulta, apenas o escopo, exemplos funcionam melhor:

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 

Há uma coluna (gangs_ocs_process.membersin) que tem uma lista de identificações que aderiram (isto é, 1,2,5). Eu estou tentando obter os nomes de usuário para cada um desses IDs (da tabela users) de uma só vez.

O problema é LEFT JOIN users u ON u.userid IN ( ocp.membersin )

Se eu 1,2,4 substitue no para ocp.membersin (colocando a lista literal em vez do nome da coluna), ele funciona ok. Devolve uma coluna que tem os nomes de utilizador ( imagem ). No entanto, se eu deixo no ocp.membersin, eu recebo este erro:

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

Esta é a primeira vez que eu usei mesmo IN na esquerda junta-se por isso estou um pouco perdido.

Qualquer ajuda seria ótimo:)

Foi útil?

Solução

Eu não acho que "IN" irá trabalhar para esta sintaxe. MySQL espera IN para ser algo semelhante a um conjunto de dados, não uma cadeia delimitada. Eu acho que você precisa encontrar uma maneira de levar membersin, expandi-lo em um MySQL conjunto de dados pode trabalhar com (talvez uma tabela temporária), e juntar-se sobre isso.

Outras dicas

Se você tem strings delimitadas na sua tabela, você tem um problema de projeto em seu banco de dados. Adicionar uma nova tabela para manter esses valores.

Você tem certeza 'membersin' está na tabela de 'gangs_ocs_process', e não uma tabela 'gangs_ocs'?

A razão que você não pode fazê-lo funcionar é porque primeiro você precisa para obter o seu banco de dados normalizado. Você deve nunca, nunca tem uma lista de ID de em uma única coluna.

Depois de tomar um outro olhar, acho que seu problema é tentar agregar no ponto errado, bem como a sintaxe IN e que você deve agregar em uma subconsulta restringido pelo conteúdo da IN. Eu não sei o suficiente sobre o esquema para fazer esta fora da caixa correta, mas você quer algo como isto. SomeKeyfield deve relacionar-se com 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

Este é um mau caminho para manter a adesão.

Mas se você ainda precisa conviver com isso, você pode tentar REGEXP correspondência para testar a associação:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top