2

(簡潔なタイトルが思いつきませんでした)

皆さんこんにちは

私は長い間サイトを閲覧してきましたが、解決できない問題に遭遇した後、サインアップして質問することにしました. この問題をどのように表現すればヘルプを探すのが難しくなったのかわかりません。これは回答済みである可能性が非常に高く、回答を見つけるための正しい検索基準がわかりません。また、私がやろうとしていることに対する答えがないかもしれません。正しい手順で質問していなかったら申し訳ありません。

私が達成しようとしていることは、スクリプトを使用して簡単に行うことができます。これが実際にこれを行う唯一の適切な方法かもしれません。私の状況では、MySQL クエリのみでこれを行うことができるかどうか尋ねられる状況に陥っています。

問題:

これが状況の性質です(トピックに簡単に要約する方法がわかりません)。mySQL データベースに 3 つのテーブルがあります。

Table: account
column: number (unique id)

Table: user
column: number (unique id)
column: account (links the user to an account)

Table: service
column: number (unique id)
column: user  (links the service to a user)
column: servdef (the type of service)

基本的に、アカウントは複数のユーザーを保持し、各ユーザーは複数のサービスを保持できます。

特定のタイプ (service.servdef) のサービス (service.number) を含まないすべてのアカウント (account.number) を表示するクエリを作成するように依頼されました。このサイトで NOT EXISTS の使用に関する投稿を見たことがありますが、私の状況では正しく機能させることができませんでした。これは単一の SQL クエリでも可能ですか? 助けてくれてありがとう!

4

5 に答える 5

3

table にレコードがないLEFT JOINものがあるため、そのために使用します。試す、usersservice

SELECT  a.*
FROM    account a
            LEFT JOIN `user` b
                on a.number = b.account
            LEFT JOIN service c
                ON b.number = c.`user`
WHERE   c.`user` IS NULL OR
        c.servdef <> 'particularService'

SQLFiddle デモ

于 2012-08-22T23:49:50.797 に答える
2

使用NOT EXISTS:

SELECT a.number
FROM account a
WHERE NOT EXISTS (
  SELECT u.account
  FROM user u INNER JOIN service s ON (u.number = s.user)
  WHERE u.account = a.number
    AND s.servdef = 'your_particular_type'
)

デモ(sqlfiddle)。

于 2012-08-22T23:52:07.473 に答える
0

これは、昨日見た別の投稿で受け入れられた回答の適応です。

@servdef は、検索するアカウントに存在しないサービス タイプです。

select a.number
from account a 
  inner join user u on a.number = u.account
  inner join service s on u.number = s.user
group by a.number
having max(case when s.servdef = @servdef then 1 else 0 end) = 0

(ゴードン、これを読んだら笑ってください)

于 2012-08-23T00:03:15.257 に答える
0

NOT INは一般的に最も遅い形式ですが、エンジンとインデックスによってはNOT EXISTSより高速になる場合があります。LEFT JOINそれぞれ試してみてください。

SELECT a.number
FROM account a
WHERE a.number NOT IN (
  SELECT u.account
    FROM user u
    INNER JOIN service s ON u.number = s.user
    WHERE s.servdef = 'your_particular_type'
)

編集:の間違った推論NOT IN、申し訳ありません。NOT EXISTSここでは当てはまらないと思いますが、null 許容列ではうまく機能しないよりも読みやすいと思いますが。

于 2012-08-22T23:54:17.133 に答える
0

問題は、MySQL のバージョンが古すぎてサブクエリをサポートできないことが判明しました。サーバーが新しいハードウェアと最新のオペレーティング システムにアップグレードされると、問題は解決されました。他の回答は技術的には正しいですが、最新バージョンの MySQL でのみ機能します。質問の時点では、MySQL のバージョンが要因であることを知りませんでした。私はチェックしようとさえ思っていたものではありませんでした。

于 2017-12-28T17:15:53.290 に答える