Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql n:m选择n中具有多个FK in关系的所有实体_Mysql_Sql_Database - Fatal编程技术网

Mysql n:m选择n中具有多个FK in关系的所有实体

Mysql n:m选择n中具有多个FK in关系的所有实体,mysql,sql,database,Mysql,Sql,Database,我必须对关系为n:m的表A和表B进行修改。所以我有一个表C来存储a和B的外键对。 我需要一个查询,该查询提供a中的所有条目,这些条目在B中有一对具有2个或更多属性。 实例第一个是ID,第二个是表可以拥有的所有属性的代表 +-----------+ | A | +-----------+ | 1 fields | | 2 fields | | ... | | n fields | +-----------+ +-----------+ | B |

我必须对关系为n:m的表A和表B进行修改。所以我有一个表C来存储a和B的外键对。 我需要一个查询,该查询提供a中的所有条目,这些条目在B中有一对具有2个或更多属性。 实例第一个是ID,第二个是表可以拥有的所有属性的代表

+-----------+
|     A     |
+-----------+
| 1 fields  |
| 2 fields  |
| ...       |
| n fields  |
+-----------+

+-----------+
|     B     |
+-----------+
| 1 fields  |
| 2 fields  |
| ...       |
| n fields  |
+-----------+

+-----------+
|     c     |
| FKA | FKB |
+-----------+
| 1      2  | <-
| 2      2  | <-
| 2      3  |
| 1      4  | <-
| 2      4  | <-
| 3      2  |
| 6      4  |
+-----------+

如何选择A中与表B中的数据集2和4有关系的所有数据集?

基本上,您要求从A表中获取所有ID,该表在表C中有两个或多个条目,因此您可以使用:

SELECT COUNT(1) AS cnt, FKA 
FROM c 
GROUP BY FKA 
    HAVING cnt >= 2
SELECT COUNT(1) AS cnt, FKA, GROUP_CONCAT(FKB SEPERATOR ",")
FROM c 
GROUP BY FKA 
    HAVING cnt >= 2
我不确定我是否理解正确,但我认为您还需要表C中每个FKA的所有FKB值的列表,您可以使用:

SELECT COUNT(1) AS cnt, FKA 
FROM c 
GROUP BY FKA 
    HAVING cnt >= 2
SELECT COUNT(1) AS cnt, FKA, GROUP_CONCAT(FKB SEPERATOR ",")
FROM c 
GROUP BY FKA 
    HAVING cnt >= 2
我还没有测试这些查询,所以可能有语法错误,但是这个想法应该是可以的

编辑;我希望这是真正问题的答案 假设您有表B的4个ID的列表,即1、4、67和133,您想知道表A链接到所有这些ID的ID;您可以使用:

SELECT COUNT(1) AS cnt, FKA 
FROM c 
WHERE (FKB = 1 OR FKB = 4 OR FKB = 67 OR FKB = 133)
GROUP BY FKA 
    HAVING cnt = 4

只有当FKA和FKB的组合在表c中是唯一的,这才是一种好的做法。

这就是连接的帮助:

SELECT *
FROM A RIGHT OUTER JOIN B ON A.ID = B.ID
这是您需要的基本SQL,反过来,您也可以这样做

SELECT *
FROM B LEFT OUTER JOIN A ON A.ID = B.ID

不,对不起,我的描述不好。因此,通过B中的给定值很容易从A中获取所有数据集。在我的例子中,示例2和4中有更多的B值。也可以是1,4,67或其他。我需要A中的所有数据集,这些数据集与表BI中的所有给定值都有关系。我不确定我是否理解,您有一个表B中的ID列表,希望从每个ID的链接中找出哪个ID?谢谢。这个看起来不错。我会立即尝试你的答案,但这不是我所要求的。我有一个B。A和BR的ID不相等。它们是绝对不同事物的钥匙。如果我遵循这一点,则必须从A.ID=C.AID上的左连接C中选择*,其中C.BID=VALUE。问题是我没有一个值,我有BYO的不同值,您可能会发现这很有用: