2

困惑している MySQL クエリがあります。2 つの異なるテーブル (宣伝文句とユーザー) から特定の情報を取得しようとしていますが、フォローしている人だけに制限しています。

次のクエリがあります。

SELECT DISTINCT blurbs.text, blurbs.timestamp, users.name, 
     users.username, users.profilepic, users.id 
FROM blurbs,users 
LEFT OUTER JOIN follows 
ON blurbs.uid = follows.following AND follows.follower = ? 
WHERE (blurbs.uid = $user_id OR follows.following IS NOT NULL) 
     AND (LOWER(blurbs.text) LIKE '%$query%' OR LOWER(users.name) LIKE '%$query%') 
     AND blurbs.is_private=0 AND blurbs.uid=users.id 
LIMIT 0,30

正しく動作していませんが、結合のために過度に混乱しています。

これを改善するにはどうすればよいですか?

4

2 に答える 2

1

where句のみを介してすべての結合条件を使用してみてください。

      select a.*, b.*     //<-- Selectign data from first two tables
      from table1 a, table2 b, table1 c
       where a.id = b.id         //<-- joining condition for first two tables
       and a.xxx= c.yyyyy        //some relation with third table
       and c.aaa =....           //filter conditions using third table
       and c.bbb =...            //filter conditions using third table

以下のようにクエリを言い換えようとしています:

   SELECT DISTINCT blurbs.text, blurbs.timestamp, users.name, 
       users.username, users.profilepic, users.id 
   FROM blurbs,users, follows
   WHERE blurbs.uid=users.id
     AND blurbs.uid = follows.following 
     AND follows.follower = ?
     AND (blurbs.uid = $user_id OR follows.following IS NOT NULL) 
     AND (LOWER(blurbs.text) LIKE '%$query%' OR LOWER(users.name) LIKE '%$query%') 
     AND blurbs.is_private=0
   LIMIT 0,30

これにより、目的のフィルター条件をより適切に制御/管理できるようになることを願っています。

于 2012-10-23T02:58:48.763 に答える
1

これがまさにあなたが探しているものであるかどうかは完全にはわかりませんが、あなたの質問の理解に基づいて私が何をしたかを説明させてください. まず、宣伝文句のユーザーがいると仮定して、クロス結合ではなく、宣伝文句とユーザーの間のINNER JOINまた、フォローしている人だけに制限したいとおっしゃっていたので、おそらくLEFTを置き換えることができると思います非フォロワーを除外するのに役立つINNER JOINを使用したOUTER。

SELECT DISTINCT 
     blurbs.text, 
     blurbs.timestamp, 
     users.name, 
     users.username, 
     users.profilepic, 
     users.id 
FROM blurbs 
INNER JOIN users 
     ON blurbs.uid = users.id 
INNER JOIN follows 
     ON blurbs.uid = follows.following 
     AND follows.follower = users.id 
WHERE blurbs.uid = $user_id 
     AND (LOWER(blurbs.text) LIKE '%$query%' OR LOWER(users.name) LIKE '%$query%') 
     AND blurbs.is_private=0 
LIMIT 0,30
于 2012-10-23T02:59:42.480 に答える