2013-05-31 4 views
2

두 개의 쿼리가 있는데 가능한 경우 한 개의 쿼리 만 Select에서 선택으로 실행하고 싶습니다.select in select

제 하나는 사용자 ID의리스트를 검색

SELECT 
users.id 
FROM users 
LEFT JOIN users_date ON users_date.user = users.id 
LEFT JOIN users_varchar ON users_varchar.user = users.id 
WHERE 
abilitato = 1 
AND users_date.key = 'birthday' 
AND users_varchar.key = 'nation' 
AND users_varchar.value = 'US' 
AND (users.reg_date >= '2013-05-31' AND users.reg_date <= '2013-05-31') 
AND (floor(DATEDIFF(NOW(), users_date.value)/365) >= 19 AND floor(DATEDIFF(NOW(), users_date.value)/365) <= 19) 

번째 (나이, 민족 또는 등록일 필터링)

SELECT count(`matches`.`id`) FROM `matches` WHERE (`matches`.`status_home` = 3 AND `matches`.`status_guest` = 3) AND (`matches`.`team_home` = 13 OR `matches`.`team_guest` = 13) 

제가 필요 자신이 검색 한 모든 ID에 대해 두 번째 선택을 수행하십시오. 모든 수행에 대해 값 13을 검색된 ID로 바꿔야합니다.

선택에서 select를 사용하여 모두 단일 쿼리에서 모두 수행 할 수 있습니까?

도움을 주셔서 감사합니다.

답변

0

이 SQL을 사용해보십시오.

SELECT count(`matches`.`id`) 
FROM `matches` m 
INNER JOIN (SELECT users.id as id 
FROM users 
LEFT JOIN users_date ON users_date.user = users.id 
LEFT JOIN users_varchar ON users_varchar.user = users.id 
WHERE abilitato = 1 
AND users_date.key = 'birthday' 
AND users_varchar.key = 'nation' 
AND users_varchar.value = 'US' 
AND (users.reg_date >= '2013-05-31' AND users.reg_date <= '2013-05-31') 
AND (floor(DATEDIFF(NOW(), users_date.value)/365) >= 19 AND floor(DATEDIFF(NOW(), users_date.value)/365) <= 19)) t 
on t.id=m.team_guest 
WHERE (`matches`.`status_home` = 3 AND `matches`.`status_guest` = 3) 
AND (`matches`.`team_home` = 13 OR `matches`.`team_guest` = t.id) 
GROUP BY t.id 
+0

은 내부 조인 시사 문제 가 있지만, ON 절을 잘못 :(t.id 값이 team_home 필드 또는 내가 또한 매개 변수 값으로 team_home = (13)을 변경해야합니다 team_guest 필드에있을 수 – Zauker

0

명시 적 조인으로 수행 할 작업을 표현할 수 있습니다. 그러나 질문은 선택 내에서 선택을 요구합니다. 이를 위해 상관 관계가있는 하위 쿼리가 필요합니다. 때문에 일치하는 상태에서 or 약간의 도전 상관 하위 쿼리없이 이렇게

select users.id, 
     (SELECT count(`matches`.`id`) 
     FROM `matches` 
     WHERE (`matches`.`status_home` = 3 AND `matches`.`status_guest` = 3) AND 
       (`matches`.`team_home` = user.id OR `matches`.`team_guest` = users.id) 
     ) as cnt 
FROM users LEFT JOIN 
    users_date 
    ON users_date.user = users.id LEFT JOIN 
    users_varchar 
    ON users_varchar.user = users.id 
WHERE abilitato = 1 AND users_date.key = 'birthday' AND 
     users_varchar.key = 'nation' AND users_varchar.value = 'US' AND 
     (users.reg_date >= '2013-05-31' AND users.reg_date <= '2013-05-31') AND 
     (floor(DATEDIFF(NOW(), users_date.value)/365) >= 19 AND 
     floor(DATEDIFF(NOW(), users_date.value)/365) <= 19 
    ) 

(서식 날 쿼리 더 잘 이해하는 데 도움이됩니다.)

됩니다 다음은 최종 쿼리입니다.