[英]PHP, MySQL - Get multiple, identifiable, rows returned from a single JOIN?
我有三張桌子,比如:
*table1*
id | val1 | val2 | val3 | val4 | val5
1 | ... | ... | ... | ... | ...
2 | ... | ... | ... | ... | ...
3 | ... | ... | ... | ... | ...
... etc
和
*table2*
id | som1 | som2
1 | ... | ...
2 | ... | ...
3 | ... | ...
... etc
和
*table3*
id | col1 | col2
1 | ... | ...
2 | ... | ...
3 | ... | ...
... etc
其中第三個表中的col2
將始終包含來自第一個表的val3
, val4
或val5
的單個值。 第二個表僅包含在完整性問題中,而不是問題。
我的查詢如下:
$db = new PDO(...);
$stmt = $db->prepare("SELECT t2.som1 AS t2som1,
t1.val1 AS t1v1,
t1.val2 AS t1v2,
t1.val3 AS t1v3,
t1.val4 AS t1v4,
t1.val5 AS t1v5,
t3.col1 AS t3col1
FROM table1 t1
JOIN table2 t2 ON t1.val2 = t2.som2
JOIN table3 t3 ON t1.val3 = t3.col2
WHERE (t1.val4=:input OR t1.val5=:input)
AND (t1.val1=1 OR t1.val1=2)");
$stmt->execute(array('input'=>$inputVal));
$result = $stmt->fetchAll();
這完全符合預期。
但!
我不僅需要t3col1
用於t1.val3 = t3.col2
。 我還需要t1.val4 = t3.col2
和t1.val5 = t3.col2
我可以構建這條線:
JOIN table3 t3 ON (t1.val3 = t3.col2 OR t1.val4 = t3.col2 OR t1.val5 = t3.col2)
但后來我不知道用哪個值來獲取t3col1
。 它只返回一個值,而不是全部三個。
看我的問題!?
我想要
SELECT t2.som1 AS t2som1,
...
t3.col1 AS t3col1, // for condition t1.val3 = t3.col2
t3.col1 AS t3col2, // for condition t1.val4 = t3.col2
t3.col1 AS t3col3 // for condition t1.val5 = t3.col2
可以這樣做嗎?
澄清
IF val1
, val2
和val3
都含有價值觀,我想單行返回,從表3的所有三場比賽。 不是三個單獨的行,除了匹配列之外都是相同的。
這個SQLFiddle是我不想要的一個例子。 請注意,除了t3col1
列之外,一切都是相同的。 這應該是一行,包含所有t3col1
值。
/澄清
我估計我可以分三次加入桌子:
SELECT t2.som1 AS t2som1,
...
t3.col1 AS t3col1
t4.col1 AS t3col2
t5.col1 AS t3col3
FROM table1 t1
JOIN table2 t2 ON t1.val2 = t2.som2
JOIN table3 t3 ON t1.val3 = t3.col2 // for condition t1.val3 = t3.col2
JOIN table3 t4 ON t1.val4 = t3.col2 // for condition t1.val4 = t3.col2
JOIN table3 t5 ON t1.val5 = t3.col2 // for condition t1.val5 = t3.col2
WHERE (...)
AND (...)
但是這樣做會失去性能(即4個JOINS),與我試圖這樣做的方式相反,只有2個?
獎金!
有時 val3
, val4
和/或val5
將為空(但col2
永遠不會為空)。 對於那些空值的情況,所有table3 JOIN都需要LEFT JOIN
嗎?
編輯1
根據您的要求,我已經在SQLFiddle中進行了設置,但是這項服務非常突破。
你可以在這里找到它
編輯2
我嘗試多次加入table3:
SELECT t2.som1 AS t2som1,
...
t3.col1 AS t3col1
t4.col1 AS t3col2
t5.col1 AS t3col3
FROM table1 t1
JOIN table2 t2 ON t1.val2 = t2.som2
JOIN table3 t3 ON t1.val3 = t3.col2 // for condition t1.val3 = t3.col2
JOIN table3 t4 ON t1.val4 = t3.col2 // for condition t1.val4 = t3.col2
JOIN table3 t5 ON t1.val5 = t3.col2 // for condition t1.val5 = t3.col2
WHERE (...)
AND (...)
並最終獲得每場比賽的一排。 我應該有7個結果,最終獲得超過90個。
val1
將始終具有值,並且每次填充val2
和val3
是否不同。 但是當這三個人都有價值觀時,我不想要三個單獨的回報。 相反,我只想要一個包含所有三個匹配的回歸。
編輯4(澄清是3 ...)
由於Siraj的回答,EDIT 2的多個JOIN最終正在工作。 問題是我用過:
JOIN table3 t3 ON t1.val3 = t3.col2
JOIN table3 t4 ON t1.val4 = t3.col2
JOIN table3 t5 ON t1.val5 = t3.col2
當我應該使用時:
JOIN table3 t3 ON t1.val3 = t3.col2
JOIN table3 t4 ON t1.val4 = t4.col2
JOIN table3 t5 ON t1.val5 = t5.col2
請注意區別? 在每個等號后面只是t3.col2
- 他們需要引用正確的表格! 其余的都保持不變,鮑勃是你的阿姨!
下面的查詢將為您提供所需的數據:
SELECT t2.som1 AS t2som1,
t1.val1 AS t1v1,
t1.val2 AS t1v2,
t1.val3 AS t1v3,
t1.val4 AS t1v4,
t1.val5 AS t1v5,
t3.col1 AS t3col1,
t3.col2 AS t3col2,
CASE WHEN t1.val3 = t3.col2 THEN t3.col1 ELSE '' END AS 't3col11',
CASE WHEN t1.val4 = t3.col2 THEN t3.col1 ELSE '' END AS 't3col21',
CASE WHEN t1.val5 = t3.col2 THEN t3.col1 ELSE '' END AS 't3col31',
CASE WHEN t1.val3 = t3.col2 THEN 't1col3'
ELSE CASE WHEN t1.val4 = t3.col2 THEN 't1col4' ELSE 't1col5'
END END AS ColumnName
FROM table1 t1
JOIN table2 t2 ON t1.val2 = t2.som2
JOIN table3 t3 ON (t1.val3 = t3.col2 OR t1.val4 = t3.col2 OR t1.val5 = t3.col2)
GROUP BY t2som1,t1v1, t1v2, t1v3, t1v4, t1v5
最后一列是'ColumnName',它告訴您哪個t1列是與該值匹配的列。
編輯 - 使用左連接
SELECT t2.som1 AS t2som1,
t1.val1 AS t1v1,
t1.val2 AS t1v2,
t1.val3 AS t1v3,
t1.val4 AS t1v4,
t1.val5 AS t1v5,
t3.col1 AS t3col1,
t3.col1 AS t3col1,
t4.col1 AS t3col2,
t5.col1 AS t3col3
FROM table1 AS t1
LEFT JOIN table2 t2 ON t1.val2 = t2.som2
LEFT JOIN table3 t3 ON t1.val3 = t3.col2
LEFT JOIN table3 t4 ON t1.val4 = t4.col2
LEFT JOIN table3 t5 ON t1.val5 = t5.col2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.