左加入位置

时间:2019-01-17 23:57:49

标签: php mysql sql arrays left-join

我有下表:

enter image description here

和具有以下代码的数组:php中的A,C,T

我需要做的是mysqli查询(无框架),结果如下:

enter image description here

所以我可以知道ids和field的值,并且知道C没有值,第2行无关紧要。

当然,WHERE IN将进行过滤,如下所示:

SELECT * FROM test t1 LEFT JOIN test t2 ON t1.idtest = t2.idtest AND t1.code IN ('A','B','C');

将显示B,但不显示C。

我正在寻找其他解决方案,例如USP,并将varchar(255)作为数组,拆分等进行传递,但是我使用了大约1000个代码,因此没有办法这样做。

任何涉及MySQL或PHP的帮助或提示都会被忽略,这当然避免了我要改进的每个代码的1000 SELECT循环。 预先感谢。

2 个答案:

答案 0 :(得分:1)

我建议坚持做最后的处理客户端。无论如何,您可能都将结果转储到本地数组或html表中,只需添加代码来记录哪些选择具有匹配项,然后为没有选择的项添加额外的条目。否则,替代方法是这样的。...

SELECT t.*
FROM ( SELECT 'A' AS code 
       UNION SELECT 'C' 
       UNION SELECT 'T'
) AS codes
LEFT JOIN test AS t ON codes.code = t.code

...如您想象的那样,使用大型列表可能会变得毫无用处。

尽管我不确定您要通过左联接本身来完成什么。

答案 1 :(得分:1)

可能的PHP解决方案,假设代码在表中是唯一的。

如果您将单个SELECT与IN一起使用,就像这样

SELECT * FROM test WHERE code IN ('A','C','T', 'etc.')

您可以在获取结果时按代码编制索引

while ($row = $stmt->fetch()) {
    $query_result[$row['code']] = $row;
}

然后迭代代码数组,并使用查询中的行(如果存在)填充结果,如果查询未返回该行,则使用空字段填充结果。

foreach ($codes as $code) {
    $result = $query_result[$code] ?? ['idtest' => null, 'field' => null, 'code' => $code];
}