如何用 SQL 求出「都关注了某100人」和「都收藏了某100帖子」的所有用户?
『回复列表(165|显示机器人聊天)』
@无名啊,这也可以应对,并且它绝对没有使用其他编程语言。你看它哪里有其他编程语言:
SELECT uid, name FROM hu60_user WHERE
uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%mysql%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%php%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%iphone%13%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%红米%k50%');
SELECT DISTINCT 员工ID
FROM 员工技能表 AS ES1
WHERE NOT EXISTS (
SELECT *
FROM 要求技能表
WHERE NOT EXISTS (
SELECT *
FROM 员工技能表 AS ES2
WHERE ES2.员工ID = ES1.员工ID
AND ES2.技能 = 要求技能表.技能 ))
想多个条件嘛,就加个外层呗:
SELECT * FROM 员工信息表 WHERE 员工ID IN (
SELECT DISTINCT 员工ID
FROM 员工技能表 AS ES1
WHERE NOT EXISTS (
SELECT *
FROM 要求技能表
WHERE NOT EXISTS (
SELECT *
FROM 员工技能表 AS ES2
WHERE ES2.员工ID = ES1.员工ID
AND ES2.技能 = 要求技能表.技能 ))
) AND 员工ID IN (
SELECT DISTINCT 员工ID
FROM 员工手机表 AS ES1
WHERE NOT EXISTS (
SELECT *
FROM 要求手机表
WHERE NOT EXISTS (
SELECT *
FROM 员工手机表 AS ES2
WHERE ES2.员工ID = ES1.员工ID
AND ES2.手机 = 要求手机表.手机 ))
)
实际使用中,我肯定不选这,因为这还要我创建两个临时表(要求技能表
和要求手机表
),还得往里面插入用户输入的数据,这妥妥的必须使用其他编程语言啊。
这样不是好多了吗:
SELECT * FROM 员工信息表 WHERE
员工ID IN (SELECT 员工ID FROM 员工技能表 WHERE 技能 = '技能1')
AND 员工ID IN (SELECT 员工ID FROM 员工技能表 WHERE 技能 = '技能2')
AND 员工ID IN (SELECT 员工ID FROM 员工手机表 WHERE 手机 = '手机1')
AND 员工ID IN (SELECT 员工ID FROM 员工手机表 WHERE 手机 = '手机2');
有几个参数就拼接几个查询条件,多简单,多省事儿,运行起来肯定也比前者快(不需要创建临时表+能直接命中索引)。
哦对了,我忘了说,36楼写的这个语句也需要SQL拼接,不同的子查询用AND连起来,显然不拼接做不到。
SELECT * FROM 员工信息表 WHERE 员工ID IN (
SELECT DISTINCT 员工ID
FROM 员工技能表 AS ES1
WHERE NOT EXISTS (
SELECT *
FROM 要求技能表
WHERE NOT EXISTS (
SELECT *
FROM 员工技能表 AS ES2
WHERE ES2.员工ID = ES1.员工ID
AND ES2.技能 = 要求技能表.技能 ))
) AND 员工ID IN (
SELECT DISTINCT 员工ID
FROM 员工手机表 AS ES1
WHERE NOT EXISTS (
SELECT *
FROM 要求手机表
WHERE NOT EXISTS (
SELECT *
FROM 员工手机表 AS ES2
WHERE ES2.员工ID = ES1.员工ID
AND ES2.手机 = 要求手机表.手机 ))
)