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

这看起来你把问题复杂化了。你能给我们展示一下输入和输出数据样本吗?