首页 > 数据库 > mysql教程 > 在 SQL 中连接表时如何跨多行强制执行条件?

在 SQL 中连接表时如何跨多行强制执行条件?

Barbara Streisand
发布: 2024-12-28 09:07:10
原创
862 人浏览过

How to Enforce Conditions Across Multiple Rows When Joining Tables in SQL?

使用 SQL 在联接中跨多行强制执行条件

考虑到您关于在联接中跨多行强制执行条件的初始查询,让我们详细说明可用的技术。

测试不同行

1A。利用 EXISTS:

SELECT *
FROM users
WHERE
  EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name = 'tag1')
  AND EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name = 'tag2')
登录后复制

1B。使用子查询:

SELECT *
FROM users
WHERE
  id IN (SELECT user_id FROM tags WHERE name = 'tag1')
  AND id IN (SELECT user_id FROM tags WHERE name = 'tag2')
登录后复制

1C。利用 JOIN:

SELECT
  u.*
FROM
  users u
INNER JOIN
  tags t1 ON u.id = t1.user_id
INNER JOIN
  tags t2 ON u.id = t2.user_id
WHERE
  t1.name = 'tag1'
  AND t2.name = 'tag2'
登录后复制

聚合行

2A。使用 COUNT 次:

SELECT
  users.id,
  users.user_name
FROM
  users
INNER JOIN
  tags ON users.id = tags.user_id
WHERE
  tags.name IN ('tag1', 'tag2')
GROUP BY
  users.id,
  users.user_name
HAVING
  COUNT(*) = 2
登录后复制

2B。使用字符串处理:

SELECT
  user.id,
  users.user_name,
  GROUP_CONCAT(tags.name) AS all_tags
FROM
  users
INNER JOIN
  tags ON users.id = tags.user_id
GROUP BY
  users.id,
  users.user_name
HAVING
  FIND_IN_SET('tag1', all_tags) > 0
  AND FIND_IN_SET('tag2', all_tags) > 0
登录后复制

注意:此方法利用 MySQL 特定的扩展,与其他方法相比效率较低。

以上是在 SQL 中连接表时如何跨多行强制执行条件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板