1

私は、PHPWebインターフェースを備えた小さな書店のデータベースを構築しています。この問題では、「products」テーブル(prod_core)のすべてのレコードを、「sales」テーブル(inc_core)の「description」フィールドと等しいproductsフィールド「barcode」の値を持つレコードなしで表示したいと思います。

私は実際にこれを最初の「sales」ミューテーションで機能させることができましたが、「sales」テーブルに2番目のレコードを追加すると、クエリは機能しなくなります。(追加された最初のレコードを除く)。これは私のSQLコードです:

SELECT prod_core.prodID、prod_core.title、prod_core.location、prod_core.genre、
       prod_core.price、prod_core.barcode
FROM prod_core
WHERE prod_core.barcode NOT IN(
         SELECT`description`
         FROM inc_core
         GROUP BY prod_core.prodID)

SQLがループしない(要件に一致するレコードのテーブル検索を停止する)ことと関係があると思いますが、よくわかりません。助けていただければ幸いです。

4

3 に答える 3

3

LEFT JOINの代わりに提案しますNOT IN

SELECT
    prod_core.prodID, 
    prod_core.title, 
    prod_core.location, 
    prod_core.genre, 
    prod_core.price, 
    prod_core.barcode
FROM 
    prod_core 
    LEFT JOIN inc_core ON inc_core.`description` = prod_core.barcode
WHERE
    inc_core.`description` IS NULL

また、SELECTステートメントのどの列も集計関数の一部ではないため、を削除しGROUP BY て...に置き換えましたDISTINCT。ただし、このテーブルに重複が含まれている理由がわかりません。

編集:私はあなたのクエリを読み間違えましたgroup byが、それはサブクエリではなく外部クエリにありました...これをキャッチした他の回答に+1します。

于 2012-08-14T22:57:02.360 に答える
2

クエリの問題は、group byが1つのフィールドによるものであるが、別のフィールドを選択していることです。これは、サブクエリが各製品の任意の説明を選択していることを意味します。期待する完全なリストを取得できるという保証はありません。

これを修正する最も簡単な方法は、次の方法でグループを削除することです。

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre,
       prod_core.price, prod_core.barcode
FROM prod_core
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core)

ただし、これは非効率的である可能性があります。サブクエリを使用する「in」の場合、存在を使用するのが最適です。また、説明にインデックスが存在することを確認してください。これは、特にmysql用の代替バージョンです。

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre,
       prod_core.price, prod_core.barcode
FROM prod_core
WHERE not exists (select 1 from inc_core where inc_core.description = prod_core.barcode)

個人的には、「in」の代わりとしての相関サブクエリの大ファンではありません。ただし、これはmysqlによって最適化されたアプローチです。

于 2012-08-14T23:06:29.097 に答える
1

group by句は必要ないと思うので、次を使用できるはずです。

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, prod_core.price, prod_core.barcode
FROM prod_core
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core)
于 2012-08-14T23:00:52.877 に答える