1

これは MYSQL クエリの質問です

まず、私たちが持っているとしましょう

[ALL_MENU]

name
-----
pasta
pizza

そして人々は注文した

ordered

customer name status              
john     pasta   delivered        
kim      pasta   delivered       
john     pizza   delivered        
john     pasta   delivered        

注文したテーブルを調べて、すべてのメニューを注文した人を見つけたい

この例では、kim はパスタのみを注文したため含まれませんが、john はパスタとピザの両方を注文したため、結果に含める必要があります。

「For ループ」機能を実行するクエリの種類はありますか?

ありがとうございました

(ps、現在、使用のみを許可しています

mysql からのいくつかの基本的な機能コマンド

グループ化、ビューの作成、存在する、すべて、存在しない、一意など)

================================================== =======================

わかりました、回答から、(顧客、名前) が主キーの場合、すべてのメニューのカウント数が機能しますが、データ列を追加し、主キーを (顧客、名前、データ) として追加するとどうなりますか?

   customer name status              date
        john     pasta   delivered        3/4
        kim      pasta   delivered        3/5
        john     pasta   delivered        3/5

これは私が作成した新しいコラムで、ジョンは 2 つの異なる日付で唯一のパスタを注文しましたが、ジョンの注文数は 2 としてカウントされます。

そのため、count メソッドはこれには機能しません

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

for ループの機能はカーソルです。(参考までに、ほとんどの DBMS にはそのような構造があります。)

ただし、単純な古いクエリで十分な場合は、カーソルを使用しないでください。

考えられる解決策の 1 つを次に示します。

SELECT customer
FROM ordered
GROUP BY customer
HAVING COUNT(DISTINCT name) = (SELECT COUNT(*) FROM all_menu)

ordered(これは、 のすべての名前が にあることを前提としていall_menusます。たとえば、外部キーがあります。そうでない場合はJOIN all_menu ON ordered.name = all_menu.nameFROM節に追加する必要があります。)

編集:「単純な」(!) コマンドのみ:

SELECT customer
FROM ordered o1
WHERE NOT EXISTS (
    SELECT * FROM all_menu
    WHERE name NOT IN (SELECT name FROM ordered o2 WHERE o1.customer = o2.customer)
)
于 2013-10-30T02:19:20.257 に答える