Как составить корректный MySQL-запрос

Узнай цену своей работы

Формулировка задачи:

Привет всем! Товарищи эксперты, требуется Ваша помощь! Есть 3 таблицы с записями (см. рис.) И есть запрос вида: "SELECT * FROM `table_users` LEFT JOIN `table_post` USING (userhash)"; Он возвращает записи сгруппированные, из 2ух таблиц `table_users` и `table_post`, которые объединены по одному полю `userhash`. Вопрос: Каким должен быть запрос, чтобы из результатов данной выборки исключить все записи, кроме той, котрая отмечена в третьей таблице `table_like`. Т.е. поля userhash и contenthash выбранной записи должны совпадать со значениями полей userhash и contenthash из таблицы table_likes. На прилагаемом рисунке искомая запись из трех таблиц обведена красным контуром. Возможно, для решения данной задачи необходимо будет соорудить некую конструкцию на подобии этой: "SELECT * FROM (SELECT * FROM `table_users` LEFT JOIN `table_post` USING (userhash)) некие условия выборки с использованием таблицы table_likes"; но подробности такого запроса для меня остаются весьма туманными. Надеюсь на Ваше просвещение. Заранее спасибо за консультацию!

Решение задачи: «Как составить корректный MySQL-запрос»

textual
Листинг программы
SELECT * 
FROM table_users tu 
        JOIN table_post tp ON tu.userhash = tp.userhash
        JOIN table_likes tl ON tl.userhash = tp.userhash AND tl.contenthash = tp.contenthash AND tl.marker LIKE 'yes' 
GROUP BY tp.id

Объяснение кода листинга программы

В данном коде происходит следующее:

  1. Выполняется операция SELECT, которая выбирает все столбцы из таблицы.
  2. В качестве источника данных указывается таблица table_users (tu).
  3. Выполняется операция JOIN с таблицей table_post (tp) по полю userhash.
  4. Выполняется операция JOIN с таблицей table_likes (tl) по полям userhash и contenthash, а также с использованием условия AND.
  5. В качестве условия для JOIN используется выражение tl.marker LIKE 'yes'.
  6. Результаты запроса группируются по полю tp.id.

Оцени полезность:

10   голосов , оценка 3.9 из 5