2009-07-28 4 views
0

LEFT JOIN команд на teams.id = (SELECT team_id FROM auth_users WHERE ID = offers.user_id)подзапросов в левой Регистрацию

дает мне все столбцы таблицы команд, но преобразует все в NULL.

LEFT JOIN teams ON teams.id = 1

работает как шарм

Когда я сделать

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

team_id будет 1.

По какой-то странной причине он не работает внутри JOIN.

Полный запрос:

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» происходит, например.

+0

Ничего себе. Спасибо! Существует только одна незначительная вещь: количество комментариев и файлов не очень хорошее. До этого было 4 и 5. Теперь они оба 140 ... –

+1

Попробуйте 'COUNT (DISTINCT c.id)' и 'COUNT (DISTINCT u.id)' – Tomalak

+0

Работает. U фантастические! Вилен чертовски! –

Смежные вопросы