2010-06-01 5 views
0
SELECT * 
FROM `seriallog` WHERE `lastevent` IN 
(SELECT GROUP_CONCAT(CONCAT(' \'', `eventid`, '\'')) 
     FROM `permissions` WHERE `permissions`.`userpkid` = 1) 
+2

당신이 얻을 기대하는거야? 실제로 무엇을 얻나요? –

답변

3

int (lastevent)와 연결된 문자열 (하위 쿼리 결과)을 비교하려고합니다.

그것은 더 많은 정보없이 얘기하기 어렵다, 그러나 이것은 아마도 당신이 원하는 무엇을 :

select * 
from seriallog sl 
inner join permissions p on sl.lastevent = p.eventid 
where p.userpkid = 1 
+0

첫 줄을 다음과 같이 작성하고 싶을 것입니다 :'SELECT sl. *' – Sonny

2

당신이 그것을 쓴 방법을, 내부 쿼리는 문자열 "1, 2, 3" 같은를 반환합니다 그래서 단지 seriallog의 행과 의 lastevent 열이 정확히 일치합니다.

아마도 SET에 값이있는 행을 검색하는 데 관심이있을 것입니다. 이것이 바로 SQL이 의도 한 것입니다. 특수 엔지니어링을 적용 할 필요가 없습니다.

SELECT * 
FROM seriallog 
WHERE EXISTS (SELECT 1 FROM permissions WHERE eventid = seriallog.lastevent AND permissions.userpkid = 1) 

이것은 MySQL이 더 가입과 같은 쿼리를 처리 할 수 ​​있고, 아마도 더 효율적으로 실행 :

SELECT * 
FROM seriallog WHERE lastevent IN 
(SELECT eventid FROM permissions WHERE permissions.userpkid = 1) 

그러나, 대신 쓰는 것이 바람직 할 것입니다 : 다음은 작동합니다.

0

MySQL에 가장 최적화 된 형식입니다. 일반적으로 MySQL은 하위 쿼리를 좋아하지 않습니다.

SELECT seriallog의 SL * FROM 는 = sl.lastevent에 대한 사용 권한 페이지에 가입 p.eventid WHERE permissions.userpkid = 1

관련 문제