【问题标题】:LEFT JOIN as WHERE INLEFT JOIN 作为 WHERE IN
【发布时间】:2019-01-17 23:57:49
【问题描述】:

我有下表:

还有一个包含以下代码的数组:A,C,T in php。

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

所以我可以知道 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 循环。 提前致谢。

【问题讨论】:

  • 那么,这与 PHP 有什么关系?
  • @Dharman 在 php 中的回答如果在纯 t-sql 中无法解决问题,也会受到重视

标签: php mysql sql arrays left-join


【解决方案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

...您可以想象,如果列表很大,可能会变得笨拙。

虽然我不确定你想用左连接来完成什么。

【讨论】:

  • 我正在考虑做类似的事情,但正如你所说,查询会很繁重。我试图将工作交给数据库,但如果这是最好的情况,(我会根据你在 SO :D 中的观点假设它)所以是的,最好跨两个数组来获得过滤后的“空”代码一个正常的加入。感谢您的回答,这让我明白,没有比客户端更好的方法了。
【解决方案2】:

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

如果你在 IN 中使用单个 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];
}

【讨论】:

  • 好主意!非常感谢!!!我之前没有看到你的答案,但投了赞成票!谢谢:)
猜你喜欢
  • 2018-12-04
  • 2016-05-27
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多