FETCH 未关联 field_name 来自 mysql table

FETCH not associated field_name from mysql table

我有 table 如下所示,

Table 1 :

ID FIELD_NAME
1 field_1
2 field_2
3 field_3

Table 2 :

ID TAG_NAME
1 tag_1
2 tag_2
3 tag_3
4 tag_4

Table 3 :

FIELD_ID TAG_ID
1 1
1 2
1 3
2 1
3 2
3 3

所以 table-3 显示:

field1(来自 table1)与 table-2

的所有 3 个标签 ID 相关联

field2(来自 table1)与 table-2

的所有标签 id=1 相关联

field3(from table1) 与 table-2

的所有标签 id=2,3 相关联

我喜欢写一个MYSQL查询来获取

对于给定的 tag_name,查找与此无关的所有字段名称

示例:

输入=tag_1

输出=field_3

解释:因为 field_3 与 tag_1 id

没有任何关系

输入=tag_4

输出=field_1,field_2,field_3

解释:因为没有字段与 tag_4 id

有任何关系

您可以通过 table1table2CROSS 连接和 return 的 LEFT 连接哟 table3不匹配的行:

SELECT t2.TAG_NAME, t1.FIELD_NAME
FROM table1 t1 CROSS JOIN table2 t2
LEFT JOIN table3 t3 ON t3.FIELD_ID = t1.ID AND t3.TAG_ID = t2.ID
WHERE t2.TAG_NAME = ? AND t3.FIELD_ID IS NULL

如果您希望结果为逗号分隔列表,您还可以按 TAG_NAME 分组并使用 GROUP_CONCAT():

SELECT t2.TAG_NAME, GROUP_CONCAT(t1.FIELD_NAME) fields
FROM table1 t1 CROSS JOIN table2 t2
LEFT JOIN table3 t3 ON t3.FIELD_ID = t1.ID AND t3.TAG_ID = t2.ID
WHERE t2.TAG_NAME = ? AND t3.FIELD_ID IS NULL
GROUP BY t2.TAG_NAME

? 替换为您要搜索的标签。

参见demo

您可以检查某些 link table 条目不存在的字段...

SELECT
  *
FROM
  table1
WHERE
  NOT EXISTS (
    SELECT *
      FROM table3
     WHERE field_id = table1.id
       AND   tag_id = (SELECT id FROM table2 WHERE tag_name = 'tag_4')
  )

(请原谅打字错误,我在 phone。)

dbfiddle 从@nbk 借来的:here