У меня есть 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
Извините, что мой первый пост не объяснен должным образом. Я так и не привык к системе форума и вскоре мне пришлось уйти, потому что в то время было уже очень поздно.






Вы немного ошиблись синтаксически:
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.
Спасибо за ваш быстрый ответ. В вашем коде не появляется ошибка, но запрос не дает результата. Я объяснил больше о своей проблеме в ОП. Спасибо
То, что вы ищете, называется LEFT OUTER JOIN (не INNER). Ссылка в моем ответе объясняет различия, но она связана с тем, какие данные включены и исключены.
Еще раз спасибо за ваш комментарий. После того, как я много пробовал, основываясь на вашем коде, я, наконец, преуспел с небольшой модификацией вашего кода. Он работает после замены AND на OR в предложении WHERE. Большое спасибо, Роуг.
Вам просто нужны простые 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...ON соединения, а не в предложение WHERESELECT *: укажите конкретные столбцы, которые вы хотите выбратьВы уверены, что результат тот, который запрошен? OP нужны записи из первого соединения И записи из второго соединения, в то время как этот запрос (поправьте меня, если я ошибаюсь) принимает только те, которые удовлетворяют обоим правилам.
@Marco: согласен - я обновил свой ответ, упомянув о возможном использовании LEFT JOIN.
Этот звучит намного лучше :)
@GMB: Спасибо за быстрый ответ. В вашем коде не появляется ошибка, но запрос не дает результата. К сожалению, в моей стране сейчас очень поздно. Я постараюсь объяснить больше о моем коде, моих данных и моей цели позже. Пс. Я впервые размещаю тему здесь. Прошу прощения, что не смог правильно разместить тему. Мне нужно узнать больше о том, как использовать этот форум.
Никто не сможет дать вам хорошие комментарии / ответы, все, что мы можем сделать, это сделать обоснованные предположения без примеров данных и ожидаемых результатов. Я советую вам прочитать Почему я должен предоставлять MCVE для того, что мне кажется очень простым SQL-запросом?, как предоставить примеры данных и ожидаемые результаты.