1

多対多の関係を持つ 3 つのテーブルに対して、次の MYSQL DB 構造があります。以下に示すように、多くのユーザーが多くの車を持つことができ、車は多くのユーザーに使用できます。

ユーザー

ID | Name
---------
100|John
101|Smith

ID | Name
---------
50|BMW
60|Audi

ユーザー_車

ID | UID | CID
---------
1| 100 |50
2| 100 |60
3| 101 |60

ページ users_cars.php があります。このページには 2 つのドロップダウン リストがあります。

  1. すべてのユーザーのリスト
  2. すべての車のリスト

このページでは、ユーザーのリストからユーザーを選択し、車のリストから車を選択し、[追加] をクリックして users_cars テーブルに挿入できます。

何をしようとしているのかは、ユーザーのドロップダウン リストから、車のテーブルから利用可能なすべての車にリンクされているすべてのユーザーを除外することです。

上記の例では、ユーザーのドロップダウン リストには「Smith」のみが表示されます。これは、「John」が利用可能なすべての車 (BMW、AUDI) にリンクされているためです。「Smith」にも BMW がある場合、彼はリストから除外されます。この条件には選択クエリが必要ですが、users_cars テーブル内のユーザー レコードをカウントするためにネスト選択クエリを使用したくありません。

4

4 に答える 4

0

クエリで使用する必要がある場合は、あなたが何であるかを理解していGROUP BYます。したがって、すべてのユーザーを選択するには:

SELECT ID, UID FROM Users_cars GROUP BY UID

すべての車の場合:

SELECT ID, CID FROM Users_cars GROUP BY CID

これにより、同じ結果がグループ化されるため、各ユーザーの 1 つのインスタンス、または各車の 1 つのインスタンスのみが取得されます。

于 2014-03-28T15:25:37.543 に答える
0

あなたの質問が正しく理解できたことを願っています。

いくつかのプログラミングを使用してこれを行うことができると思います-

PHP/mysql を使用 -

  1. すべての個別の車 ID の数を取得します
  2. 各ユーザーの車の数を取得します。(一意の車の ID のみがリストされていることを確認してください)

すべてのユーザーをループし、各ループで上記の 2 つを比較して、この条件に一致するユーザーを除外します。

于 2014-03-28T15:29:36.137 に答える
0

基本的に、あなたがやりたいことはそれです(私があなたの問題を理解していれば):

SELECT UID  FROM Users_cars WHERE CID NOT IN (SELECT ID FROM Cars);

ただし、注意してください、これは貪欲な要求です (もちろんテーブルのサイズによって異なります)。ユーザー テーブルにフラグを立てて、ユーザーが利用可能な最後の車を (またはバッチで) 使用したときに更新することをお勧めします。リクエストをあまり頻繁に実行しないでください。

于 2014-03-28T15:31:44.243 に答える
0
SELECT *
FROM   users
WEHRE  id NOT IN (SELECT uid
                  FROM   (SELECT          uid, COUNT(cid), COUNT(*)
                          FORM            cars
                          LEFT OUTER JOIN users_cars ON cars.id = users_cars.cid
                          GROUP BY        uid
                          HAVING          COUNT(cid) = COUNT(*)
于 2014-03-28T15:30:34.457 に答える