SELECT `bio_community_events`.`id`,
`bio_community_events`.`begin_on`,
`bio_community_events`.`name`
FROM `bio_community_events`
JOIN `bio_contacts`
ON (`bio_contacts`.`contact_id` = `bio_community_events`.`user_id`)
WHERE `bio_contacts`.`user_id` = '33'
UNION ALL --- or UNION if this gives you
--- duplicate row
SELECT `bio_community_events`.`id`,
`bio_community_events`.`begin_on`,
`bio_community_events`.`name`
FROM `bio_community_events`
JOIN `bio_contacts`
ON (`bio_contacts`.`user_id` = `bio_community_events`.`user_id`)
WHERE `bio_contacts`.`contact_id` = '33'
かのように例#1の行が返されます。
(SELECT ...)
UNION ALL
(SELECT ...)
ORDER BY ? --- optional
LIMIT x ;
ORDER BY
を使用すると、このようなクエリでかなりのコストがかかる可能性があります。 EXISTS
を使用している
(SELECT ...
ORDER BY ?
LIMIT a
)
UNION ALL
(SELECT ...
ORDER BY ?
LIMIT b
)
LIMIT x ; --- with or without this LIMIT
元の問題を解決するための別の方法:
SELECT `bio_community_events`.`id`,
`bio_community_events`.`begin_on`,
`bio_community_events`.`name`
FROM `bio_community_events`
WHERE EXISTS
(SELECT *
FROM `bio_contacts`
WHERE `bio_contacts`.`user_id` = '33'
AND `bio_contacts`.`contact_id` = `bio_community_events`.`user_id`
)
OR EXISTS
(SELECT *
FROM `bio_contacts`
WHERE `bio_contacts`.`contact_id` = '33'
AND `bio_contacts`.`user_id` = `bio_community_events`.`user_id`
)
か:
SELECT `bio_community_events`.`id`,
`bio_community_events`.`begin_on`,
`bio_community_events`.`name`
FROM `bio_community_events`
WHERE EXISTS
(SELECT *
FROM `bio_contacts`
WHERE (`bio_contacts`.`user_id` = '33'
AND `bio_contacts`.`contact_id` = `bio_community_events`.`user_id`)
OR (`bio_contacts`.`contact_id` = '33'
AND `bio_contacts`.`user_id` = `bio_community_events`.`user_id`)
)
また、インデックスを使用することができ、この(別の)クエリを持つことができます
あなたの計画がfiの場合最も効率的なクエリーを実行し、正しく動作するすべてのものを試してみましょう(INを使用し、UNIONを使用し、EXISTSを使用) - コースから外したいORDER BY
を追加し、スピードと実行計画を確認してください。
I少なくとも有するであろう:
ために使用するフィールド(単数または複数)にuser_id
索引の索引および テーブルbio_contacts
で
- 、2つの複合インデックス
(contact_id, user_id)
上
上
そして、あなたはそれがXミリ秒未満で実行させることができない場合(別の質問を投稿しますあなたの上司が決めたX:
なぜあなたはイベントの記録者ではなく、イベントの作成者に関係していますか? d自体? –
「SELECT ... FROM bio_contacts」のように? – daGrevis