2013-02-26 5 views
1

Я пытаюсь сделать запрос с 2 соединениями, которым обоим нужно предложение WHERE. Я заметил, что это не работает и что я могу добавить только ГДЕ в конце соединения. Так что я хотел бы знать, как я могу сделать это лучше вместо ..2 LEFT JOINs с предложением WHERE не работает

Это мой текущий запрос, который оленья кожа принять, где в первом присоединиться:

SELECT 
    p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers 
FROM 
    posts_tbl AS p 
LEFT JOIN 
    post_reply_tbl AS c ON c.post_id = p.id WHERE c.type = 1 AND c.type = 3 
LEFT JOIN 
    post_reply_tbl AS a ON a.post_id = p.id WHERE a.type = 2 
GROUP BY p.id 
+1

Это не там, где 'WHERE' положения идут. Правильный синтаксис SQL - это 'SELECT ... FROM ... [LEFT] JOIN ... ON ... [AND ...] WHERE ... [AND ...]' –

+0

О да, это правда, но мне нужно для указания типа для этих таблиц – 2013-02-26 16:51:04

+0

Также 'c.type = 1 И c.type = 3' не имеет смысла. –

ответ

5

изменения, которые к AND а не WHERE:

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers 
FROM posts_tbl AS p 
LEFT JOIN post_reply_tbl AS c 
    ON c.post_id = p.id 
    AND c.type = 1 AND c.type = 3 
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2 
GROUP BY p.id 

Я думаю, что вы должны изменить это немного, хотя, потому что c.type не может иметь два значения одновременно:

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers 
FROM posts_tbl AS p 
LEFT JOIN post_reply_tbl AS c 
    ON c.post_id = p.id 
    AND c.type IN (1, 3) -- changed to use an OR 
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2 
GROUP BY p.id 

Если вы хотите c.type быть равен как 1 и 3, то вы, возможно, захотите рассмотреть вопрос об использовании:

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, c.answers 
FROM posts_tbl AS p 
LEFT JOIN 
(
    select COUNT(c.id) answers, c.post_id 
    from post_reply_tbl c 
    where c.type in (1, 3) 
    group by c.post_id 
    having COUNT(distinct type) = 2 
) AS c 
    ON c.post_id = p.id 
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2 

Просто следуя вверх примечание на запрос, так как вы используете GROUP BY на только один столбец, MySQL решает, какие значения для других столбцов возвращаются, и значения могут быть неожиданными. Единственный способ, которым вы можете быть уверенным в возвращаемом значении, - объединить каждый столбец или группу ими. (См MySQL Extensions to GROUP BY)

С MySQL Docs:

MySQL расширяет применение GROUP BY так, чтобы выбрать список может относиться к неагломерированным столбцам не указанным в GROUP BY предложения. ... Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно, прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы. Сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY. Сортировка набора результатов происходит после того, как были выбраны значения, и ORDER BY не влияет на значения, которые выбирает сервер.

По этой причине он может быть лучше использовать подзапрос, чтобы получить count() тогда вы будете уверены, что вы возвращаете правильный результат для остальных столбцов .:

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, c.answers 
FROM posts_tbl AS p 
LEFT JOIN 
(
    select COUNT(c.id) answers, c.post_id 
    from post_reply_tbl c 
    where c.type in (1, 3) 
) AS c 
    ON c.post_id = p.id 
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2 
+0

вы просто подметаете этот сайт своими быстрыми ответами. Нет шансов на любые ответы для меня :) – DevelopmentIsMyPassion

+0

Да.Весь «ВКЛ» является условием объединения и может иметь несколько частей. – BradC

+0

Как может 'c.type = 1 И c.type = 3'? Это должно быть 'AND (c.type = 1 OR c.type = 3)' или 'c.type IN (1,3)'. –

0

Вы можете добавить все в условиях, когда в конце запроса:

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers 
       FROM posts_tbl AS p 
       LEFT JOIN post_reply_tbl AS c ON c.post_id = p.id 
           LEFT JOIN post_reply_tbl AS a ON a.post_id = p.id 
WHERE a.type = 2 
    AND c.type = 1 AND c.type = 3 
GROUP BY p.id 

или использование и в соединении условий:

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers 
       FROM posts_tbl AS p 
       LEFT JOIN post_reply_tbl AS c ON c.post_id = p.id AND c.type = 1 AND c.type = 3 
           LEFT JOIN post_reply_tbl AS a ON a.post_id = p.id AND a.type = 2 
           GROUP BY p.id 
0

Просто поместите все условия в одном пункте, где

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT AS answers 
FROM posts_tbl AS p 
LEFT JOIN post_reply_tbl AS c ON c.post_id = p.id 
LEFT JOIN post_reply_tbl AS a ON a.post_id = p.id 
WHERE a.type = 2 AND c.type = 1 AND c.type = 3 
GROUP BY p.id 
Смежные вопросы