2016-03-26 5 views
0

Привет, я почти делал это, но мне нужно изменить важную вещь, но у меня нет идеи ее восстановить. Есть мой пример SQLПроверьте, не существуют ли значения с предложением WHERE IN - MYSQL

SELECT post.id,post.name as post_name, 
(SELECT users.login FROM users WHERE post.creator = users.id) creator, 
(SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) recommends, 
(SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) comments, 
GROUP_CONCAT(tags.tag SEPARATOR ',') as tags 
FROM posts 
LEFT JOIN tags 
ON post.id = tags.idea_id 
WHERE post.name IN 
(
    SELECT post.name FROM posts 
    JOIN tags ON post.id = post.idea_id 
    WHERE tags.tag IN ('X','Y','Z') 
) 
GROUP BY post.name 

В чем проблема? Если наш X или Y или Z не существует, запрос все еще работает. Я не знаю, как отремонтировать, я попробовал некоторые НЕ СУЩЕСТВУЮЩИЕ предложения или НЕ ЭТО, но он не работает. Спасибо за помощь.

+0

Что именно вы ищете? Ваш запрос имеет смысл, ища сообщения с одним из тегов, хотя запрос слишком сложный. –

+0

Если вам нравится, подумайте о следующем простом двухэтапном курсе действий: 1. Если вы еще этого не сделали, предоставьте правильные инструкции CREATE и INSERT (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, который соответствует информации, предоставленной на шаге 1. – Strawberry

+0

Да, но если один из этих тегов из ('X', 'Y', 'Z'), например не существует из тегов сообщений, тогда результат является ложным, несмотря на то, что остальные существуют. –

ответ

0

I вы ищете посты, которые имеют любой один из тегов, вы можете сделать:

SELECT post.id, post.name as post_name, 
     (SELECT users.login FROM users WHERE post.creator = users.id) as creator, 
     (SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) as recommends, 
     (SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) as comments, 
     GROUP_CONCAT(tags.tag SEPARATOR ',') as tags 
FROM posts LEFT JOIN 
    tags 
    ON post.id = tags.idea_id 
GROUP BY post.id, post.name 
HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) > 0; 

Примечание: Я изменил GROUP BY включить post.id (при условии, что имя является уникальным для каждого id). Хорошей практикой является включение всех неагрегированных столбцов в пункт GROUP BY. Если одно и то же имя имеет несколько идентификаторов, удалите post.id из SELECT.

Если вы хотите, чтобы все три из тегов и нет дубликатов (разумное предположение), то изменить HAVING на:

HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) = 3; 
Смежные вопросы