Mysql

MYSQL 獲取不在其他表中的行

  • February 27, 2021

我有兩個具有 1 個相同數據列的表進行比較。

一個表“物種”是一個廣泛的物種列表,每個數據行都有一個唯一的 ID,稱為“suid”添加。像往常一樣到它的主要ID。第二個表“printpipe”是用於列印輸出的購物車,每一行都有來自該物種的 suid 和來自使用者“guid”的唯一個人 ID。

現在我想從“species”中獲取所有行,在“stockimg”欄位中具有空欄位“stockimg”而不是“noimage.png”,並且在表“printpipe”中不存在具有相同 suid 並且 memb_guid 與使用者 guid 相同的使用者 guid作為變數 $guid

我試過的查詢是:

$get_allspecies = $mysqli->query("SELECT * FROM  species WHERE stockimg <> 'noimage.png' AND stockimg <> '' AND NOT EXISTS (SELECT * FROM printpipe WHERE printpipe.suid = species.suid AND memb_guid = '$guid') ORDER BY name_sc, name_de");

但它不起作用。我究竟做錯了什麼?

感謝你的回复。我昨天在這方面進一步調查並得到了這個解決方案:

SELECT * FROM species WHERE stockimg <> ’noimage.png’ AND stockimg <> ’’ AND suid NOT IN (SELECT suid FROM printpipe WHERE memb_guid = ‘$guid’) ORDER BY name_sc, name_de

這對我有用。“noimage.png”是一個顯示虛擬圖像的圖像文件,以防尚未上傳相應的圖像。為了確保也處理空欄位,我也驚呼了它們。所以只拍攝帶有圖像的欄位。並且需要將它們與也使用 suid 的其他 table printpipe 進行比較,因此可以進行比較。因此,現在如果使用者的列印管道(購物車)中已經有該物種,則該物種不再顯示在其他列表(目錄)中,以供選擇用於列印的購物車在此處輸入圖像描述

您應該使用LEFT JOIN它來獲取左側表格中的所有記錄JOIN。然後,您可以使用WHERE子句過濾除speciesnot in之外的任何內容printpipe。它會使程式碼更簡單,如下所示:

SELECT S.*
FROM species S
LEFT JOIN printpipe P
   ON S.suid = P.suid
WHERE 
   S.memb_guid = '$guid' -- Member GUID
   AND S.stockimg &lt;&gt; '' -- Not empty
   AND S.stockimg &lt;&gt; 'noimage.png' -- Not noimage.png
   AND P.suid IS NULL -- Doesn't exist in printpipe
ORDER BY S.name_sc, S.name_de

這假定該memb_guid欄位是species表的一部分(否則,如果它是printpipe表的一部分,則無法獲取對於 inprintpipe中的特定值不存在的記錄printpipe)。

您的文章還說“有空欄位“stockimg” ”,但您的查詢沒有空欄位 stockimg。我以為你的文章有錯字,你的意思是不是空的。

請注意,除了對這個問題的邏輯和語法答案之外,還關心安全性的任何人,使用內聯變數作為 SQL 字元串的一部分(例如在 OP 的範例中)容易受到 SQL 注入的影響。有替代方法可以利用變數作為查詢的一部分。

引用自:https://dba.stackexchange.com/questions/285762