0

mysql データベースに 2 つのテーブル ストアと共有があります。IN句を避けようとしています。詳しくは下記をご覧ください

select id, user_id from stores where user_id =7;
+----+---------+
| id | user_id |
+----+---------+
| 36 |       7 |
| 37 |       7 |


select stores_id,share_id from shares where share_id=7;
+-----------+----------+
| stores_id | share_id |
+-----------+----------+
|        15 |        7 |
|        38 |        7 |

今、私はこれを実行します

SELECT stores.id
FROM   stores
WHERE  user_id = 7
UNION
(SELECT stores.id
 FROM   stores
 WHERE  id IN (SELECT stores_id
               FROM   shares
               WHERE  share_id = 7)); 

以下の結果を得るには:

+----+
| id |
+----+
| 36 |
| 37 |
| 15 |
| 38 |
+----+

質問 INキーワード を使用しないようにクエリを書き直すにはどうすればよいですか?

4

4 に答える 4

1

次のいずれかを使用できますEXISTS

WHERE EXISTS
       ( SELECT 1
           FROM shares
          WHERE share_id = 7
            AND stores_id = stores.id
       )

またはJOIN

JOIN shares
  ON shares.stores_id = stores.id
 AND shares.share_id = 7

JOIN(一部のストアの複数のコピーが返される可能性があることに注意してください。ただし、がUNION意味するためSELECT DISTINCT、最終的な結果セットには実際には影響しません。)

于 2012-07-13T21:03:32.060 に答える
0

これはあなたに役立ちます:

select stores.id from stores where user_id = 7  
UNION  
select s1.id from stores s1 
       inner join shares s2 
       on s2.share_id = 7 
       and s1.id = s2.stores_id;
于 2012-07-13T21:01:57.947 に答える
0

必要なのは ID だけであれば、これで問題ありません...

SELECT stores.id
FROM   stores
WHERE  user_id = 7

UNION

SELECT stores_id as id
FROM   shares
WHERE  share_id = 7

しかし、store テーブルの他の列からのデータが必要な場合は、INNER JOIN または EXISTS が最適です。

于 2012-07-13T21:06:50.503 に答える
0

左結合は、探しているものを達成する必要があります。

select distinct stores.id 
from stores 
left join shares on stores.id = shares.stores_id
where stores.user_id = 7 
or shares.share_id = 7
于 2012-07-13T21:07:12.037 に答える