代码之家  ›  专栏  ›  技术社区  ›  Leandro Bardelli

左连接作为

  •  0
  • Leandro Bardelli  · 技术社区  · 6 年前

    我有下表:

    enter image description here

    以及具有以下代码的数组: A,C,T 在PHP中。

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

    enter image description here

    所以我可以知道ID和字段的值,也知道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 回复  |  直到 6 年前
        1
  •  1
  •   Uueerdo    6 年前

    我建议坚持只做最后处理客户端。您可能会将结果转储到本地数组或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
    

    …正如你所能想象的那样,用大名单可能会很难做到。

    虽然我不确定你想通过左派的加入来实现什么。

        2
  •  1
  •   Don't Panic    6 年前

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

    如果在中使用一个select,如下所示

    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];
    }