簡體   English   中英

左加入位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM