【问题标题】:FETCH not associated field_name from mysql tableFETCH 未从 mysql 表中关联 field_name
【发布时间】:2021-09-23 19:07:48
【问题描述】:

我有如下表格,

表 1:

ID FIELD_NAME
1 field_1
2 field_2
3 field_3

表 2:

ID TAG_NAME
1 tag_1
2 tag_2
3 tag_3
4 tag_4

表 3:

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

所以表 3 显示:

field1(from table1) 与 table-2 的所有 3 个标签 ID 相连

field2(from 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 有任何关系


【问题讨论】:

  • 您有一个简单的 3 表解决方案来处理 多对多 关系。课本案例。

标签: mysql sql mysql-workbench


【解决方案1】:

您可以检查某些链接表条目不存在的字段...

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')
  )

(请原谅错别字,我正在打电话。)

从@nbk 借来的dbfiddle:here

【讨论】:

    【解决方案2】:

    您可以通过 CROSS 连接 table1table2LEFT 连接 yo 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2015-08-07
      • 2010-10-07
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多