MySQL - запрос AND для объединенной таблицы

0

У меня довольно длинный SQL-запрос:

SELECT *, content.contentID AS thisID
FROM content
LEFT JOIN link_keywords ON content.contentID = link_keywords.contentID
LEFT JOIN link_countries ON content.contentID = link_countries.contentID
LEFT JOIN link_sections ON content.contentID = link_sections.contentID
WHERE status = '1' AND typeID = '1'
GROUP BY contentID
ORDER BY creationDate DESC

Я возвращаю набор результатов, что я хотел бы сделать, это показать все результаты, в которых sectionID (который происходит из соединения link_sections) равен как 3, так и 4. Другими словами, все результаты, которые находятся в оба раздела 3 и 4.

Следующий запрос ничего не возвращает, по-видимому, это потому, что он проверяет одну строку с sectionID равным 3 и 4. Мне нужен любой content.contentID с sectionID равным 3 и 4.

SELECT *, content.contentID AS thisID
FROM content
LEFT JOIN link_keywords ON content.contentID = link_keywords.contentID
LEFT JOIN link_countries ON content.contentID = link_countries.contentID
LEFT JOIN link_sections ON content.contentID = link_sections.contentID
WHERE status = '1' AND typeID = '1' AND (sectionID = '3' AND sectionID = '4')
GROUP BY contentID
ORDER BY creationDate DESC
  • 1
    Мне нужен любой content.contentID с sectionID, равным 3 и 4. Это невозможно. Вы имеете в виду две строки с одинаковым content.contentID и sectionID, равным 3 и 4 соответственно?
  • 0
    Здравствуй. Да, так что представьте, что content.contentID равен 1 (это отдельная запись статьи). Эта статья может быть в разных разделах. Поэтому я хочу только записи статей, которые находятся в обоих разделах 3 и 4.
Показать ещё 2 комментария
Теги:
join

3 ответа

2
Лучший ответ

Вы можете использовать sub-SELECTs:

SELECT *, content.contentID AS thisID
FROM content
LEFT JOIN link_keywords ON content.contentID = link_keywords.contentID
LEFT JOIN link_countries ON content.contentID = link_countries.contentID
LEFT JOIN link_sections ON content.contentID = link_sections.contentID
WHERE status = '1' AND typeID = '1' AND
      content.contentID IN (SELECT section3.contentID
                            FROM link_sections AS section3
                            WHERE sectionID = 3) AND
      content.contentID IN (SELECT section4.contentID
                            FROM link_sections AS section4
                            WHERE sectionID = 4)
GROUP BY contentID
ORDER BY creationDate DESC
  • 0
    +1 Это работает быстрее и более элегантно, чем у меня.
  • 0
    Отлично - я очень ценю помощь, которую вы мне оказали. Спасибо.
1

Попробуйте следующее:

SELECT
  *,
  content.contentID AS thisID
FROM content
  LEFT JOIN link_keywords
    ON content.contentID = link_keywords.contentID
  LEFT JOIN link_countries
    ON content.contentID = link_countries.contentID
  LEFT JOIN link_sections
    ON content.contentID = link_sections.contentID
WHERE 
(SELECT COUNT(contentID) AS counter FROM link_sections s2 WHERE s2.contentID=content.contentID AND (sectionID='3' OR sectionID='4') GROUP BY contentID)=2
    AND STATUS = '1'
    AND typeID = '1'
    AND (sectionID = '3'
         OR sectionID = '4')
GROUP BY content.contentID
ORDER BY creationDate DESC;
  • 0
    Привет - да, я пробовал это, но это возвращает contentID's, которые либо в sectionID 3 или sectionID 4. То, что я хочу, это элементы в обоих разделах.
  • 0
    Отредактировано и теперь работает в соответствии с требованиями, но решение Дэниела лучше, просто оставьте его здесь для сравнения.
0

Что вам нужно сделать, это выбрать строки с sectionID = '3' и пересечь результаты с строками с sectionID = '4'.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню