我有三个表,是这样的:PHP,MySQL - 从单个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的所有三场比赛。不是三个单独的行,除匹配列外全部相同。
This 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联接),而不是我怎么了试图做到这一点,只有2?
奖励!
有时val3
,val4
和/或val5
将是空的(但col2
是从未空)。所有table3 JOIN需要为LEFT JOIN
s,对于那些空值的情况?
编辑1
按照您的要求,我已经把它架在SQLFiddle,但服务是打了小姐。
你可以找到它here
EDIT 2
我试图加入表3中多次:
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 ...)
的多次join从EDIT 2是什么结束了工作,这要归功于西拉杰的答案。问题是,我用:
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
--他们需要引用正确的表格!其余的都保持不变,鲍勃是你的阿姨!
可以使用案例可以告诉你哪些值是用于第一个查询加入构建您的查询。 –
为您的示例数据提供SQL小提琴,然后很容易回答。 –
请记住,如果这是一个'InnoDB'表,那么必须在表模式中定义* first *字段作为主键和外键。 –