簡體   English   中英

如何在一個MySQL查詢中選擇2個聯接表?

[英]How to SELECT 2 joined tables in one MySQL query?

我有1個master_table和2個sub_tables。 我想將3列連接在一起(但是問題是2個sub_tables沒有共享相同值的任何列),然后根據來自2個sub_tables的2個不同的列進行SELECT *。

我已經搜索並嘗試了許多編碼方式,但是找不到解決方案。

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";

預期結果:所有答復為“ Y”的注冊人的ECHO個人數據

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中的代碼沒有錯誤,但是echo沒有任何作用。

如果無法根據需要編寫查詢代碼,則只需將列名(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

您是否只需要這3個表之間的簡單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 * :具體要選擇的列
  • 使用表別名使查詢更易於閱讀

從語法上來說,您有點不滿意:

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的更新,將INNER換為LEFT OUTER

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM