0

So I have two tables, one containing user info (Users), and the other containing info of which users not to show (Settings). So, I want to do a query that will show all the users in the users table except the ones listed in the settings. Thanks in advance.

Users

| id | name  |
===============
| 1  | adam  |  
| 2  | alex  |  
| 3  | andrew|

Settings

| id | name | value | user_id |
===============================  
| 1  | hide | 1     | 1       | 

I want the results to be :

| id | name  | 
==============
| 1  | alex  |  
| 2  | andrew| 
4

4 に答える 4

2

あるテーブルに存在するものの、別の (関連する) テーブルには存在しないもののリストを取得するには、有名な LEFT JOIN-NULL コンボを使用できます。

   SELECT u.id, u.name
     FROM users AS u
LEFT JOIN settings AS s
       ON s.user_id = u.id
    WHERE s.user_id IS NULL

... または従属サブクエリの NOT IN 句:

   SELECT u.id, u.name
     FROM users AS u
    WHERE u.id NOT IN (SELECT user_id FROM settings)

私は通常最初のものを使用しますが、この記事によると、それらの間に大きな速度の違いはないはずです。とにかく、特定の DB インスタンスでそれらをベンチマークしてから、最適なものを選択することをお勧めします。

于 2012-10-12T15:30:54.077 に答える
2

何かのようなもの:

SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM settings WHERE name="hide");

設定名が「非表示」に等しい設定テーブルにないユーザーテーブルからユーザーのみを取得します

于 2012-10-12T15:31:46.243 に答える
0

SELECT * FROM users WHERE id NOT IN (SELECT * FROM settings)

于 2012-10-12T15:30:47.877 に答える
0

これを試して

SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM settings WHERE user_id='1');

于 2012-10-12T16:37:24.903 に答える