共有カレンダーアプリで次のことを試みるクエリ(繰り返し部分を文字列定数からまとめたもの)を書きました。mysql:ネストされた句を取り除く手助けをしてください
- 現在の日付+時刻0でないステータスを持つすべてのユーザーの検索
status_relation
- 現在の曜日+時刻0でないステータスを持つすべてのユーザーの検索
default_status_relation
。status_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)
に同じことを行うことができますSUM()のような集合関数のようなものでは、サブクエリーは必要ありません。これはかなり複雑に見える: - /なぜあなたはLEFT JOINの代わりにRIGHT JOINを使用していますか? –
私は完全な外部結合(mysql 5.1はafaikをサポートしていません)をしようとしています。 –