2012-03-20 6 views
0

共有カレンダーアプリで次のことを試みるクエリ(繰り返し部分を文字列定数からまとめたもの)を書きました。mysql:ネストされた句を取り除く手助けをしてください

  • 現在の日付+時刻0でないステータスを持つすべてのユーザーの検索status_relation
  • 現在の曜日+時刻0でないステータスを持つすべてのユーザーの検索default_status_relationstatus_relationで何も利用できない場合は、デフォルトの週間ステータスが表示されます。外側のフル
  • は、この後、その日にすべてのユーザーの(状況が存在しない場合、またはデフォルトの状態)の状態のいずれかが表示されますPHPで処理されますユーザーID
  • からユーザ名に参加する参加誰がステータス=!0を持っていますか?
  • PHPはそれが(外部結合をシミュレートするために、UNIONで)

は、現在のクエリが動作状態またはデフォルトの状態に戻ったかどうかを知る必要があります。しかし、私はそれを最適化したいと思います - サブクエリを削除すると助けになるかもしれません。それはどうやってできますか?

SELECT q.*, 
    users.username, 
    users.userid AS uid 
FROM (SELECT * 
    FROM ((SELECT sr.status AS srstatus, 
        dsr.status AS dsrstatus, 
        sr.userid AS sruserid, 
        dsr.userid AS dsruserid 
      FROM (SELECT * 
        FROM status_relation 
        WHERE DATE = '2012-03-19' 
          AND TIME = '0' 
        ) sr 
      LEFT JOIN 
        (SELECT * 
        FROM default_status_relation 
        WHERE weekday = '0' 
        AND TIME = '0') 
        ) dsr 
      ON sr.userid = dsr.userid) 
      UNION 
      (SELECT sr.status AS srstatus, 
        dsr.status AS dsrstatus, 
        sr.userid AS sruserid, 
        dsr.userid AS dsruserid 
      FROM (SELECT * 
        FROM status_relation 
        WHERE DATE = '2012-03-19' 
          AND TIME = '0') sr 
        RIGHT JOIN (SELECT * 
           FROM default_status_relation 
           WHERE weekday = '0' 
             AND TIME = '0') dsr 
         ON sr.userid = dsr.userid) 
     ) myjoin 
    WHERE ((sruserid IS NOT NULL 
       AND srstatus != '0') 
       OR (sruserid IS NULL 
        AND dsrstatus != '0'))) q 
    LEFT JOIN users 
    ON (q.sruserid = users.userid 
      OR q.dsruserid = users.userid) 
+0

に同じことを行うことができますSUM()のような集合関数のようなものでは、サブクエリーは必要ありません。これはかなり複雑に見える: - /なぜあなたはLEFT JOINの代わりにRIGHT JOINを使用していますか? –

+0

私は完全な外部結合(mysql 5.1はafaikをサポートしていません)をしようとしています。 –

答えて

0

あなたはこの部品を交換することができるはずです。

SELECT sr.status AS srstatus, 
    dsr.status AS dsrstatus, 
    sr.userid AS sruserid, 
    dsr.userid AS dsruserid 
FROM status_relation sr 
left join default_status_relation dsr 
    ON sr.userid = dsr.userid and 
     sr.date = '2012-03-19' and 
     sr.time = TIME = '0' and 
     dsr.weekday = 0 and 
     dsr.time = 0; 

によって

(SELECT sr.status AS srstatus, 
    dsr.status AS dsrstatus, 
    sr.userid AS sruserid, 
    dsr.userid AS dsruserid 
FROM (SELECT * 
     FROM status_relation 
     WHERE DATE = '2012-03-19' 
      AND TIME = '0' 
     ) sr 
LEFT JOIN 
    (SELECT * 
    FROM default_status_relation 
    WHERE weekday = '0' 
     AND TIME = '0') 
    ) dsr 
ON sr.userid = dsr.userid) 

あなたは、いくつかを使用していない限り、一般的に言えばUNION

+0

私はあまりにもそうだと思っていましたが、奇妙なことに、クエリは日付がnullでなく、指定された日付と一致しない行を返します(同様に時間も同じです)。 –

+0

ここで何を意味するのか分かりません...どの日が間違っていますか? 「dsr.date is not null」を追加することができますか? – haltabush

関連する問題