-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。

我用过INFIND_IN_SETMySQL 语句,但没有帮助。

谢谢!

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

您的问题没有正确答案,因为问题是基于错误的。

你的表结构是错误的。这不是“关系”,此外,您在文本字段中有数字。

这是非常糟糕的设计。

如果你想删除一个 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 回答