我有下表:
和具有以下代码的数组:php中的A,C,T
。
我需要做的是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循环。 预先感谢。
答案 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];
}