문제

이 작은 SQL 오류로 인해 나에게 버그가 있습니다. 쿼리에 문제가되지 않는 것 같습니다. 스코프 (?), 예제가 가장 잘 작동합니다.

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 

그 핵심 (angs_ocs_process.membersin)이 결합 된 ID 목록 (예 : 1,2,5)이 있습니다. 이 ID 각각의 사용자 이름을 얻으려고합니다 ( users 테이블) 한 번에.

문제는 LEFT JOIN users u ON u.userid IN ( ocp.membersin )

내가 대체한다면 1,2,4ocp.membersin (열 이름 대신 문자 목록을 넣음)는 작동합니다. 사용자 이름이있는 열을 반환합니다 (영상). 그러나 OCP.Membersin을 떠나면이 오류가 발생합니다.

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

왼쪽 결합에서 내가 처음 사용했기 때문에 조금 길을 잃었습니다.

모든 도움이 좋을 것입니다 :)

도움이 되었습니까?

해결책

나는 "in"이이 구문에 효과가 있다고 생각하지 않습니다. MySQL은 구분 된 문자열이 아니라 데이터 세트와 비슷한 것으로 기대합니다. MySQL이 데이터 세트로 확장하여 (임시 테이블) 작업 할 수있는 방법을 찾아야한다고 생각합니다.

다른 팁

테이블에 문자열이 구분 된 경우 데이터베이스에 설계 문제가 있습니다. 이 값을 보유 할 새 테이블을 추가하십시오.

'gangs_ocs'테이블이 아닌 '멤버 인'이 'gangs_ocs_process'테이블에 있다고 확신하십니까?

당신이 그것을 얻을 수없는 이유는 먼저 데이터베이스를 정규화해야하기 때문입니다. 단일 열에 ID 목록이 없어야합니다.

또 다른 모습을 보인 후, 귀하의 문제는 IN 구문뿐만 아니라 잘못된 시점에서도 집계하려고 노력하고 있으며 IN의 내용에 의해 제한된 하위 퀘스트를 집계해야한다고 생각합니다. 나는 당신의 스키마에 대해 이것을 상자에서 올바르게 만들 수있는 충분한 것을 모르지만, 당신은 이와 같은 것을 원합니다. 일부 키 필드는 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

이것은 나쁜 방법 멤버십을 유지합니다.

하지만 여전히 살아야한다면 시도해 볼 수 있습니다. REGEXP 멤버십을 테스트하기 위해 일치 :

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top