簡體   English   中英

PHP,MySQL - 從單個JOIN返回多個可識別的行?

[英]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始終包含來自第一個表的val3val4val5的單個值。 第二個表僅包含在完整性問題中,而不是問題。

我的查詢如下:

$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.col2t1.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 val1val2val3都含有價值觀,我想單行返回,從表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個?

獎金!

有時 val3val4和/或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將始終具有值,並且每次填充val2val3是否不同。 但是當這三個人都有價值觀時,我不想要三個單獨的回報。 相反,我只想要一個包含所有三個匹配的回歸。

編輯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.

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