Mysql Select语句,其中where子句子查询返回要检查的多行(如果包含在另一个子查询中)
这大概就是我一直试图做的,我似乎不知道如何让它发挥作用Mysql Select语句,其中where子句子查询返回要检查的多行(如果包含在另一个子查询中),mysql,sql,Mysql,Sql,这大概就是我一直试图做的,我似乎不知道如何让它发挥作用 SELECT a.name FROM tableA a, TableB b WHERE a.key = b.key AND (SELECT b.values FROM tableA a, TableB b WHERE a.key = b.key AND a.name = Prime_Key) IN (SELECT b.values FROM tableA a, TableB b WHERE a.key = b
SELECT a.name FROM tableA a, TableB b
WHERE a.key = b.key
AND (SELECT b.values FROM tableA a, TableB b
WHERE a.key = b.key
AND a.name = Prime_Key) IN
(SELECT b.values FROM tableA a, TableB b WHERE a.key = b.key)
我有两个表,从表a到表B有一对多的关系。我需要一个select,从tableB中查找tableA中特定名称的所有值,然后查找与所有值关联的所有名称。因此,最终输出将是一个名称列表,该列表与给定Prime_键具有的所有值都有链接
一些示例数据如下所示:
表a:
name key
Bob 1
Alice 2
Mark 3
Jill 4
Luke 5
表B:
key value
1 short
1 boy
2 tall
2 girl
2 blond
3 short
3 brownhair
3 boy
3 golf
4 girl
5 golf
5 boy
5 brownhair
因此,如果我用Bob替换Prim_Key,结果将是Markas,因为他既有short值,也有boy值。同样,如果Prim_Key被标记,则不会返回,因为没有其他人拥有他所做的所有值。首先,我使用GROUP_CONCAT函数将每个键的值分组为一个,同时创建like子句的模式
SELECT key,
GROUP_CONCAT(VALUE ORDER BY VALUE DESC SEPARATOR '%' ) AS myValues
FROM tableB
GROUP BY key;
结果会是这样的:
key value
1 boy%short
2 blond%girl%tall
3 boy%brownhair%golf%short
4 girl
5 boy%brownhair%golf
然后创建like查询以获得结果。为简单起见,您可以使用以下方法创建视图:
CREATE VIEW table_ab AS (SELECT key, GROUP_CONCAT(VALUE ORDER BY VALUE DESC SEPARATOR '%' ) AS myValues
FROM tableB
GROUP BY key);
最后,您可以通过以下方式获得结果:
SELECT
t2.name
FROM
table_ab t1
LEFT JOIN test_a t2
ON t1.key = t2.key
WHERE t1.myvalues LIKE
(SELECT myvalues FROM table_ab WHERE key = (SELECT key FROM test_a a WHERE a.name = 'Bob')) AND t2.name != 'Bob'
您可以使用子查询联接+计数匹配来获得结果:
SELECT
person_name,
sum(total_match) total_matches,
num_attributes
FROM (
SELECT
search_name,
search_value,
num_attributes,
person_name,
sum(is_match) total_match
FROM (
SELECT
search_subject.name as search_name,
search_subject.value as search_value,
search_subject.total_attributes as num_attributes,
people.name as person_name,
people.value as person_value,
IF(search_subject.value=people.value,1,0) as is_match
FROM (
SELECT
name,
value,
total_attributes
FROM tablea
JOIN tableb USING(`key`)
JOIN (
SELECT count(*) total_attributes
FROM tablea
JOIN tableb using(`key`)
WHERE name = 'Bob'
) attributes_count
WHERE name = 'Bob'
) search_subject
JOIN (
SELECT
name,
value
FROM tablea
JOIN tableb using(`key`)
) people ON ( search_subject.name <> people.name)
) x
GROUP BY search_name, search_value, person_name
) y
GROUP BY person_name
HAVING total_matches = num_attributes
这看起来你把问题复杂化了。你能给我们展示一下输入和输出数据样本吗?