2009-07-28 13 views
0

하위 쿼리

나에게 팀 테이블의 모든 열을 제공하지만 NULL 모든 것을 변환 = (ID = offers.user_id가 WHERE auth_users FROM team_id 선택) teams.id ON 팀을 가입하세요. 매력

같은

LEFT JOIN teams ON teams.id = 1

작품은 내가

SELECT (SELECT team_id FROM auth_users WHERE id = offers.user_id) as team_id 

team_id이는 JOIN 내에서 작동하지 않는 이상한 이유 1.

될 것입니다 수행 할 때.

전체 쿼리 : 사전에

SELECT projects.id, projects.title as title, winner_id, projects.user_id as user_id, until, pages, types.title as type, types.id as type_id, projects.id as id, offers.price as price, offers.delivery_date as delivery_date, teams.*, 
(SELECT COUNT(id) FROM comments WHERE comments.project_id = projects.id AND comments.private = 1) as comments, 
(SELECT COUNT(id) FROM uploads WHERE uploads.project_id = projects.id) as files, 
(SELECT country FROM auth_users WHERE auth_users.id = offers.user_id) as baser_country, 
(SELECT business FROM auth_users WHERE auth_users.id = offers.user_id) as baser_business, 
(SELECT CONCAT(firstname, ' ', lastname) FROM auth_users WHERE auth_users.id = offers.user_id) as baser_name, 
(SELECT team_id FROM auth_users WHERE id = offers.user_id) as team_id, 
(SELECT country FROM auth_users WHERE auth_users.id = projects.user_id) as customer_country, 
(SELECT business FROM auth_users WHERE auth_users.id = projects.user_id) as customer_business 
FROM projects 
JOIN types ON projects.type_id = types.id 
LEFT JOIN offers ON projects.id = offers.project_id 
LEFT JOIN teams ON teams.id = (SELECT team_id FROM auth_users WHERE id = offers.user_id) 
WHERE projects.user_id = 1 AND winner_id != 0 AND uploaded = 1 
GROUP BY projects.id 
ORDER BY projects.id DESC 
LIMIT 3 

감사합니다!

+1

전체 원본 쿼리를 게시 할 수 있습니까 ("LEFT JOIN"이전에 발생) –

+0

1) 질문은 무엇입니까? 당신은 우리에게 많은 쿼리를 제공하지만, 당신이 실제로하려고하는 것을 알아내는 데 사용됩니다. 2) 쿼리의 나머지 부분이 없으면 우리가 무엇을 처리하고 있는지 알지 못합니다. – chaos

+0

전체 쿼리를 추가했습니다. 읽어 주셔서 감사합니다! –

답변

5

먼저 모든 하위 쿼리를 제거해야합니다. 올바른 조인을 사용하면 실제로 그 중 아무 것도 필요하지 않습니다. 따라서 쿼리가 매우 복잡해지며 쿼리 성능에 영향을주지 않습니다.

검색어를 가장 잘 이해하려면 다음과 같이 표시되어야합니다.

SELECT 
    p.id     AS project_id, 
    MIN(p.title)   AS project_title, 
    MIN(winner_id)  AS winner_id, 
    MIN(p.user_id)  AS project_user_id, 
    MIN(until)   AS until, 
    MIN(pages)   AS pages, 
    MIN(t.id)   AS type_id, 
    MIN(t.title)   AS type_title, 
    MIN(o.price)   AS offer_price, 
    MIN(o.delivery_date) AS offer_delivery_date, 
    -- m.*, <-- this should be avoided, especially in a grouped query 
    COUNT(c.id)   AS count_comments, 
    COUNT(u.id)   AS count_files, 
    MIN(ao.country)  AS baser_country, 
    MIN(ao.business)  AS baser_business, 
    MIN(CONCAT(ao.firstname, ' ', ao.lastname)) AS baser_name, 
    MIN(ao.team_id)  AS baser_team_id, 
    MIN(ap.country)  AS customer_country, 
    MIN(ap.business)  AS customer_business 
FROM 
    projects p 
    INNER JOIN types  t ON p.type_id = t.id 
    LEFT JOIN offers  o ON o.project_id = p.id 
    LEFT JOIN comments c ON c.project_id = p.id AND comments.private = 1 
    LEFT JOIN uploads  u ON u.project_id = p.id 
    LEFT JOIN auth_users ao ON ao.id = o.user_id 
    LEFT JOIN auth_users ap ON ap.id = p.user_id 
    LEFT JOIN teams  m ON m.id = o.team_id 
WHERE 
    p.user_id = 1 
    AND winner_id != 0 
    AND uploaded = 1 
GROUP BY 
    p.id 
ORDER BY 
    p.id DESC 
LIMIT 3 

다음으로는 출력에 그룹화되지 않았거나 집계되지 않은 필드가있는 그룹화 된 쿼리를 작성해서는 안됩니다. 쿼리의 모든 불량 그룹화되지 않은 필드에 MIN() 집계 함수를 사용했습니다.

짧은 테이블 별칭을 사용하는 것이 좋습니다. 어디에서나 테이블 별칭을 사용하는 것이 좋습니다. 예를 들어 어떤 테이블에서 "winner_id"이라는 테이블에 관한 질문을 할 때 제 3 자 독자로서 완전히 잃어 버렸습니다.

+0

와우. 정말 고마워! 단 하나의 사소한 것이 있습니다. 주석과 파일의 수가 모두 좋지 않습니다. 이제는 4와 5였습니다. 이제는 둘 다 140입니다. –

+1

'COUNT (DISTINCT c.id)'및 'COUNT (DISTINCT u.id)'시도 – Tomalak

+0

작품. U는 환상적입니다! Vielen dank! –