0

このクエリを最適化しようとしていますが、取得できないようです。どんな助けも大歓迎です。これはストアド プロシージャ内にあるため、1 は IN パラメータに置き換えられます。


userGroupRelation

userGroupID BIGINT --> グループ テーブルの userGroupID への外部キー

userID BIGINT --> users テーブルへの外部キー


テーブルフォルダ

ownerID BIGINT --> users テーブルへの外部キー

postersGroup BIGINT --> グループ テーブルの userGroupID への外部キー

他のもの ...


SELECT folders.*,COUNT(userGroupRelation.userID) AS users
  FROM folders
LEFT JOIN userGroupRelation
  ON folders.postingGroupID = userGroupRelation.userGroupID
WHERE folders.ownerID = 1
  OR userGroupRelation.userGroupID IN (
    SELECT userGroupID FROM userGroupRelation WHERE userID = 1)
GROUP BY folders.folderID;

私は基本的に、ユーザーが見ることができるすべてのフォルダーを取得したいと考えています (彼が所有しているか、そのフォルダーのポスターのグループに属しているため)

4

1 に答える 1

0

2 つのアプローチを提案します。1 つは自分のものと似ていますが、サブクエリを削除してCOUNT句を修正しています。COUNT ... AS usersユーザーのすべてのフォルダーを取得することを指定しただけなので、ここで結果が重要かどうかはあなたの質問からは不明です。

SELECT 
  folders.*,
  COUNT(DISTINCT IFNULL(userGroupRelation.userID, folders.ownerID)) AS users
FROM 
  folders
  LEFT JOIN userGroupRelation ON folders.postingGroupID = userGroupRelation.userGroupID
WHERE 
  folders.ownerID = 1
  OR userGroupRelation.userID = 1
GROUP BY 
  folders.folderID
;

これは、サブクエリが削除されているため、独自のソリューションよりも多少優れていますが、OR最適化が難しいこの状態のままです.2つの異なるテーブルで機能します.

編集:この次の解決策は、質問に答えず、まったく機能しません:(

まったく異なるアプローチは、usersテーブルから始めることです (もちろんテーブルがあると仮定します):

SELECT 
  folders.*
FROM 
  users
  LEFT JOIN folders ON (folders.ownerID = users.id)
  LEFT JOIN userGroupRelation ON (userGroupRelation.userId = users.id)
  LEFT JOIN folders ON (folders.postingGroupID = userGroupRelation.userGroupID)
WHERE 
  users.id = 1
GROUP BY 
  folders.folderID
;

users.id適切なインデックスがあり、すべての結合列がある場合、これははるかに最適化されています。でも:

  1. フォルダごとの(他の)ユーザーの数はわかりません
  2. SELECT filders.* .... GROUP BY filders.folderId厳密には有効な SQL ではありませんが、 strict を使用していない場合でも機能しますsql_mode。あなた自身のクエリから、そうではないことがわかるので、それについては詳しく説明しません。
于 2012-07-19T05:40:08.900 に答える