2017-09-04 82 views
-3

之間的聯接我想從2個表選擇列,2內相同的2個表

INNER JOIN條件$table1.idaction_url=$table2.idaction$table1.idaction_name=$table2.idaction

但是,從下面的查詢中,沒有輸出。看起來INNER JOIN似乎只能有1個條件。如果我將AND包含在下面的查詢中所示的兩個條件中,則不會有任何輸出。請看下面的圖片。請指教。

enter image description here

$mysql=("SELECT conv(hex($table1.idvisitor), 16, 10) as visitorId, 
$table1.server_time, $table1.idaction_url, 
$table1.time_spent_ref_action,$table2.name, 
$table2.type, $table1.idaction_name, $table2.idaction 
FROM $table1 
INNER JOIN $table2 
    ON $table1.idaction_url=$table2.idaction 
    AND $table1.idaction_name=$table2.idaction 
WHERE conv(hex(idvisitor), 16, 10)='".$id."' 
ORDER BY server_time DESC"); 
+0

您必須使用表的別名 – Jens

+1

內連接可以絕對有這樣的條件。你能提供一些樣本數據嗎?它會幫助我們幫助你。 – Mureinik

+0

@Mureinik我添加了一張圖片來查看示例數據。如果您認爲這將在$ table1列idaction_url和idaction_name都指向表2中的列名稱。所需的輸出idaction_url包含url並且idaction_name顯示url頁面的標題。所需的輸出位於圖片左側的圖中。請諮詢 –

回答

0

簡短的回答,以確定:

您需要使用兩個獨立的內部連接,不僅單個連接。

例如

SELECT `actionurls`.`name` AS `actionUrl`, `actionnames`.`name` AS `actionName` 
FROM `table1` 
INNER JOIN `table2` AS `actionurls` ON `table1`.`idaction_url` = `actionurls`.`idaction` 
INNER JOIN `table2` AS `actionnames` ON `table1`.`idaction_name` = `actionurls`.`idaction` 

(修改此查詢時需要選擇其他字段)。

深入INNER JOIN,當完成對第二個表唯一的值(該操作中加入第一個表的表)將只獲取一行。你想要做的是從另一個表中取兩次數據到同一行,讀取語句的選擇部分。

INNER JOIN table2 ON [comparison]將用於從table1選擇各行,從table2爲此[comparison]TRUE抓住任何行,則行從table1Ñ次,其中Ñ是行中table2發現的量複製。如果N = 0,則該行被跳過。在我們的案例中,N = 1因此INNER JOINidaction_nametable1idactiontable2例如將允許您選擇所有動作名稱。

爲了獲得行動網址,我們必須第二次登錄INNER JOIN。現在,您無法正常連接兩次同一個表,因爲在查詢的第一部分中鍵入table2.name時,SQL將不知道這兩個連接表中的哪一個是有意義的。如果兩者具有相同的名稱,這將是不明確的。有一個解決方案,table aliases

輸出(以上我的回答)將是這樣的:

+-----+------------------------+-------------------------+ 
| Row |  actionUrl  |  actionName  | 
+-----+------------------------+-------------------------+ 
| 1 | unx.co.jp/    | UNIX | Kumamoto Home | 
| 2 | unx.co.jp/profile.html | UNIX | Kumamoto Profile | 
| ... | ...     | ...      | 
+-----+------------------------+-------------------------+ 

而如果你只使用一個單一的加盟,你會得到這樣的輸出(使用OR):

+-----+-------------------------+ 
| Row |  actionUrl   | 
+-----+-------------------------+ 
| 1 | unx.co.jp/    | 
| 2 | UNIX | Kumamoto Home | 
| 3 | unx.co.jp/profile.html | 
| 4 | UNIX | Kumamoto Profile | 
| ... | ...      | 
+-----+-------------------------+ 

使用AND和單個連接,只有在idaction_name == idaction_urlTRUE時纔會得到輸出。事實並非如此,所以沒有輸出。

如果您想了解更多關於如何使用JOINS的信息,請參閱manual

旁註

另外,我不禁注意到你正在使用的存儲表的名稱變量(例如$table1)。你確定這些值不包含用戶輸入嗎?而且,如果他們這樣做,您是否至少將用戶可以訪問的表格清單列入白名單?你可能會遇到一些安全問題。

+0

由於表名很長,我使用'$ table1 =「long_table_names」;'但這給了我錯誤,未知的tables.column。 。 。 –

+0

真正的表名中是否有空格?例如。一個名爲「unx profiles」的表必須在您的查詢中轉義。嘗試使用'\'unx profiles \''而不是'unx profiles'。 我的例子使用'table1'和'table2'作爲表名。將這些替換爲真實姓名,他們應該工作。 – aphid

+0

沒有空間,它是這樣的:table_of_url_names –

0

INNER JOIN不把任何限制上它可以具備的條件數量。

零結果行意味着沒有行同時滿足兩個條件。

確保您使用正確的列進行連接。試着一步一步去從那裏數據丟失

+0

感謝您的答案。我相信查詢沒有拿起第二個連接條件,我想知道爲什麼? –