在SQL中选择同一列上匹配多个条件的记录
SQL查询有时需要检索在同一列上匹配多个条件的记录。但是,简单地使用多个具有相同列的WHERE子句并不总是能产生预期的结果。考虑以下示例:
我们有一个包含联系人和指示每个联系人状态的标志的数据库表。该表包含以下数据:
ID | contactid | flag | flag_type |
---|---|---|---|
118 | 99 | Volunteer | 1 |
119 | 99 | Uploaded | 2 |
120 | 100 | Via Import | 3 |
121 | 100 | Volunteer | 1 |
122 | 100 | Uploaded | 2 |
目标是仅返回同时匹配“Volunteer”和“Uploaded”标志条件的联系人ID。使用以下查询:
<code class="language-sql">SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'</code>
将不会返回任何结果,因为每个条件只检查一个特定的标志值。要检索所需数据,我们需要使用替代方法。
使用GROUP BY和HAVING
一种解决方案是使用GROUP BY和HAVING子句。以下查询将按contactid分组结果并计算匹配标志值的个数:
<code class="language-sql">SELECT contact_id FROM your_table WHERE flag IN ('Volunteer', 'Uploaded') GROUP BY contact_id HAVING COUNT(*) = 2 -- 必须与WHERE flag IN (...)列表中的数字匹配</code>
同时具有“Volunteer”和“Uploaded”标志的联系人将计数为2。然后,HAVING子句过滤结果,只包括这些联系人。
使用连接
另一种方法是使用连接。以下查询将在your_table表上执行自连接:
<code class="language-sql">SELECT T1.contact_id FROM your_table T1 JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded' -- // 如果需要,可以添加更多连接 WHERE T1.flag = 'Volunteer'</code>
此查询将创建一个临时表,其中包含同时具有“Volunteer”和“Uploaded”标志的所有联系人的组合。然后,WHERE子句过滤结果,只包括满足这两个条件的联系人。
方法选择
选择具有同一列上多个条件的记录的最佳方法取决于数据的规模和结构。对于具有很长匹配条件列表的大型数据集,GROUP BY和HAVING解决方案可能更有效。对于具有较短匹配条件列表的小型数据集,JOIN解决方案可能更快。
以上是如何在SQL中选择与同一列上的多个条件匹配的记录?的详细内容。更多信息请关注PHP中文网其他相关文章!