-1

私は次のテーブル構造を持っています

表1:

| id | allowed_user_type |
| 1  | 8,9,10  |

表2:

| id | user_type |
| 1  | 9         |

そのため、表2のuser_typeが表1のallowed_user_typeに存在するかどうかを確認したかったので、trueを返します。存在しない場合はfalseを返します。

私はMySQLステートメントを使用INしましたが、助けにはなりません。FIND_IN_SET

ありがとう!

4

3 に答える 3

5

FIND_IN_SET私のために働きます。

select t1.id, find_in_set(user_type, allowed_user_type) > 0 found
from table1 t1 join table2 t2 using (id);

SQLFIDDLE

しかし、私はこれが貧弱なデザインであるという他のポスターに同意します。多数の行に対してこれを行う必要がある場合、インデックスを使用できないため、非常に遅くなります。

于 2012-10-27T04:53:45.073 に答える
2

正規表現の魔法を使って、データからフィールドを引き出すことができallowed_user_typeます。しかし、それだけの価値はありません。テーブル構造を変更する必要があります。

テーブルの構造には実際にはもう少し多くのデータがあると思いますが、いずれにせよ、Table1を次の構造に作り直すと、自分の生活がとても楽になります。

| id | allowed_user_type |
| 1  | 8                 |
| 2  | 9                 |
| 3  | 10                |

次に、クエリは単純です

ここで、Table1.allowed_user_type = Table2.user_type

于 2012-10-27T04:21:18.667 に答える
1

質問は何か間違ったことに基づいているので、あなたの質問に対する正しい答えはありません。

テーブル構造が間違っています。これは「リレーショナル」ではなく、さらにテキストフィールドに数字があります。

これは非常に悪いデザインです。

1つのallowed_user_typeを削除したい場合はどうなりますか?複雑なコードが必要になります...

これに取り組むのをやめ、リレーショナルデータベースについて学び、プロジェクトに戻ることをお勧めします。

正しいデザインは次のようになります。

Table 1:
| id | allowed_user_type |
| 1  | 8                 |
| 1  | 9                 |
| 1  | 20                |

Table 2:
| id | user_type |
| 1  | 9         |

そして、次のようにクエリします。

SELECT [Table 2].id 
FROM [Table 2], [Table 1]
WHERE [Table 2].user_type in ([Table 1].allowed_user_type);

このクエリは、ユーザーが許可されていない場合は0行を返し、ユーザーが「許可されている」場合は1行を返します。次のような「count()」関数を使用することもできます。

SELECT count([Table 2].id)
FROM [Table 2], [Table 1]
WHERE [Table 2].user_type in ([Table 1].allowed_user_type);

これにより、一致する行の数を含む1つのフィールドを持つ1つの行が返されます。0は「許可されていない」を意味し、「1」は「許可されている」を意味します。

テーブル名またはフィールド名にスペースがある場合は、中括弧が必要です。スペースがない場合は、スペースを使用する必要はありません。

于 2012-10-27T04:33:25.183 に答える