[英]LEFT JOIN as WHERE IN
我有下表:
和具有以下代碼的數組: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循環。 提前致謝。
我建議堅持只做最后的處理客戶端。 無論如何,您可能都將結果轉儲到本地數組或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
...您可以想像到,使用大型清單可能會變得毫無用處。
雖然我不確定您要通過左聯接本身來完成什么。
可能的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];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.