是否存在多个和像IN一样的语句的mysql子句?

时间:2011-12-09 19:33:56

标签: php mysql sql-match-all

是否有一种简单的方法来执行多个AND语句,如IN子句对OR?

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

一般情况下是不可能的,
一列只能存储一个值,
status = 1 AND status =2

时你不会遇到这种情况

例外情况为set data type

答案 2 :(得分:0)

这是一个关于Stack Overflow的常见问题,我正在为它创建一个新标记sql-match-all。我会回去尝试标记一些与此问题相关的旧答案。

根据您的简要描述,我假设您的意思是要返回一组与所有一组值匹配的行,例如标记的文章(php,mysql,performance)。 IN()谓词不要求所有三个标记都匹配,但给定的数据行只有一个标记,而WHERE子句一次只能测试一行。

这个问题有两种流行的解决方案。第一个是计算行组中有多少个不同的标签,如果它等于你想要匹配的标签列表,则通过测试。

SELECT t.article
FROM Tags t
WHERE t.tag IN ('php', 'mysql', 'performance')
GROUP BY t.article
HAVING COUNT(DISTINCT tag) = 3;

另一个解决方案是自行加入与您要查找的标签数量相同的次数。通过使用INNER JOIN,可以将结果集限制为仅匹配的组。

SELECT t1.article
FROM Tags t1
INNER JOIN Tags t2 USING (article)
INNER JOIN Tags t3 USING (article)
WHERE (t1.tag, t2.tag, t3.tag) = ('php', 'mysql', 'performance');

哪种解决方案更好可能取决于您要匹配的标记数量,在应用程序中构建此查询的方便程度,以及您的RDBMS品牌擅长的特定优化。例如,后者的解决方案在MySQL中通常要快得多,因为MySQL倾向于为GROUP BY查询编写临时表。但是你应该测试数据库中的两种查询类型以确保它们。