Как выбрать две объединенные таблицы в одном запросе MySQL?

У меня есть 1 master_table и 2 sub_tables. Я хочу объединить 3 столбца вместе (но проблема в том, что в 2 подтаблицах нет столбцов с одинаковым значением), а затем SELECT * на основе 2 разных столбцов из 2 подтаблиц.

Я искал и пробовал много способов кодирования, но не смог найти решение.

SELECT *
FROM (master INNER JOIN sub_1 ON master.id=sub_1.id WHERE sub_1.column_1 = 'Y')
AND (master INNER JOIN sub_2 ON master.id=sub_2.id WHERE sub_2.column_2 = 'Y')
ORDER BY master.id

++++++++++++++++++++++++++++++++++++++++++++++++++++
* Наконец, решено. Смотрите решение внизу этого поста. * ++++++++++++++++++++++++++++++++++++++++++++++++++++

===========

Обновлено: объясните больше о моих данных, проблеме и коде MySQL

У меня есть 3 таблицы, хранящиеся в MySQL, как показано ниже.

Master_table: regist
------------------------------------------
| reg_no | firstname | lastname | submit |
------------------------------------------
|   1    |  first_A  |  last_A  |   N    |
|   2    |  first_B  |  last_B  |   A    |
|   3    |  first_C  |  last_C  |   P    |
|   4    |  first_D  |  last_D  |   P    |
|   5    |  first_E  |  last_E  |   A    |
|   6    |  first_F  |  last_F  |   N    |
|   7    |  first_G  |  last_G  |   N    |
|   8    |  first_H  |  last_H  |   A    |
------------------------------------------

Sub_1: sub_A                       Sub_2: sub_P
------------------------------        ------------------------------
| reg_no | A_title | reply_A |        | reg_no | P_title | reply_P |
------------------------------        ------------------------------
|   2    |   222   |    Y    |        |   3    |   333   |    N    |
|   5    |   555   |    N    |        |   4    |   444   |    Y    |
|   8    |   888   |    Y    |        ------------------------------
------------------------------

Я хочу создать запрос, который дает такой результат

----------------------------------------------------------------------------------
| reg_no | firstname | lastname | submit | A_title | reply_A | P_title | reply_P |
----------------------------------------------------------------------------------
|   2    |  first_B  |  last_B  |   A    |   222   |    Y    |         |         |
|   8    |  first_H  |  last_H  |   A    |   888   |    Y    |         |         |
|   4    |  first_D  |  last_D  |   P    |         |         |   444   |    Y    |
----------------------------------------------------------------------------------

or

-----------------------------------------------------------
| reg_no | firstname | lastname | submit | title |  reply |
-----------------------------------------------------------
|   2    |  first_B  |  last_B  |   A    |  222  |   Y    |
|   8    |  first_H  |  last_H  |   A    |  888  |   Y    |
|   4    |  first_D  |  last_D  |   P    |  444  |   Y    |
-----------------------------------------------------------

$sql = "SELECT *
    FROM (regist INNER JOIN sub_A ON regist.reg_no = sub_A.reg_no WHERE sub_A.reply_A = 'Y')
    AND  (regist INNER JOIN sub_P ON regist.reg_no = sub_P.reg_no WHERE sub_P.reply_P = 'Y')
    ORDER BY regist.reg_no";

Ожидаемый результат: Персональные данные ECHO всех зарегистрировавшихся, получивших ответ «Y»

if ($row['submit']= = "A") $title = $row['A_title'];
elseif ($row['submit']= = "P") $title = $row['P_title'];

$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result))
{
  echo $row['reg_no']." / ".$row['firstname']." ".$row['lastname']." / ".$title."<br>";
}

Проблема: мой код SELECT привел к ошибке. Код от @GMB и @Rogue ошибок не дал, но эхо ничего не дало.

Если невозможно закодировать запрос так, как я хочу, я просто изменю имена столбцов (sub_1.reply_A и sub_2.reply_P), чтобы они были одинаковыми, и изменю входной код на других веб-страницах. Однако было бы лучше, если бы был способ, потому что я не знаю, использовались ли где-то еще столбцы «ответ».

========================

Решение: небольшая модификация кода @Rogue

SELECT *
FROM master
LEFT OUTER JOIN sub_1
   ON master.id=sub_1.id
LEFT OUTER JOIN sub_2
   ON master.id=sub_2.id
WHERE sub_1.column_1 = 'Y'
   OR sub_2.column_2 = 'Y'
ORDER BY master.id

Никто не сможет дать вам хорошие комментарии / ответы, все, что мы можем сделать, это сделать обоснованные предположения без примеров данных и ожидаемых результатов. Я советую вам прочитать Почему я должен предоставлять MCVE для того, что мне кажется очень простым SQL-запросом?, как предоставить примеры данных и ожидаемые результаты.

Raymond Nijland 07.02.2019 15:44

Извините, что мой первый пост не объяснен должным образом. Я так и не привык к системе форума и вскоре мне пришлось уйти, потому что в то время было уже очень поздно.

C. Verathamjamras 08.02.2019 12:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
79
2

Ответы 2

Вы немного ошиблись синтаксически:

SELECT *
FROM master
LEFT OUTER JOIN sub_1
   ON master.id=sub_1.id
LEFT OUTER JOIN sub_2
   ON master.id=sub_2.id
WHERE sub_1.column_1 = 'Y'
   AND sub_2.column_2 = 'Y'
ORDER BY master.id

Лично я бы рекомендовал не использовать SELECT * и собирать только те данные, которые вам нужны. Что касается определения того, какое объединение использовать, мне нравится ссылаться на Сообщение в блоге CodingHorror в эти времена.

Обновлено: ВНУТРЕННИЙ заменен на ЛЕВЫЙ ВНЕШНИЙ, согласно обновлению OP.

Спасибо за ваш быстрый ответ. В вашем коде не появляется ошибка, но запрос не дает результата. Я объяснил больше о своей проблеме в ОП. Спасибо

C. Verathamjamras 08.02.2019 12:34

То, что вы ищете, называется LEFT OUTER JOIN (не INNER). Ссылка в моем ответе объясняет различия, но она связана с тем, какие данные включены и исключены.

Rogue 09.02.2019 18:26

Еще раз спасибо за ваш комментарий. После того, как я много пробовал, основываясь на вашем коде, я, наконец, преуспел с небольшой модификацией вашего кода. Он работает после замены AND на OR в предложении WHERE. Большое спасибо, Роуг.

C. Verathamjamras 11.02.2019 05:04

Вам просто нужны простые JOIN между этими тремя таблицами?

SELECT m.*, s1.*, s2.*
FROM master m
INNER JOIN sub_1 s1 ON m.id=s1.id AND s1.column_1 = 'Y'
INNER JOIN sub_2 s2 ON m.id=s2.id AND s2.column_2 = 'Y'
ORDER BY m.id;

Если у вас есть основные записи, которых может не быть в обеих подтаблицах, вы можете переключиться на LEFT JOIN, чтобы избежать их фильтрации.

Методические рекомендации :

  • типичный синтаксис SELECT ... FROM table1 INNER JOIN table2 ON ... INNER JOIN table3 ON...
  • лучше поместить все условия, связанные с JOINed таблицей, в предложение ON соединения, а не в предложение WHERE
  • избегайте SELECT *: укажите конкретные столбцы, которые вы хотите выбрать
  • используйте псевдонимы таблиц, чтобы упростить чтение запроса

Вы уверены, что результат тот, который запрошен? OP нужны записи из первого соединения И записи из второго соединения, в то время как этот запрос (поправьте меня, если я ошибаюсь) принимает только те, которые удовлетворяют обоим правилам.

Marco 07.02.2019 15:46

@Marco: согласен - я обновил свой ответ, упомянув о возможном использовании LEFT JOIN.

GMB 07.02.2019 15:48

Этот звучит намного лучше :)

Marco 07.02.2019 15:49

@GMB: Спасибо за быстрый ответ. В вашем коде не появляется ошибка, но запрос не дает результата. К сожалению, в моей стране сейчас очень поздно. Я постараюсь объяснить больше о моем коде, моих данных и моей цели позже. Пс. Я впервые размещаю тему здесь. Прошу прощения, что не смог правильно разместить тему. Мне нужно узнать больше о том, как использовать этот форум.

C. Verathamjamras 07.02.2019 16:38

Другие вопросы по теме