【问题标题】:read value from column and run query based on that从列中读取值并基于该值运行查询
【发布时间】:2021-06-29 12:35:32
【问题描述】:

我的数据库中有一个包含 2 列的表:namefamilies,它们都是 varchar。例如:

name     families
----------------------
A        'B','C'
B        'A'
C        'A','B'
...

现在我想获取行,其名称在第一行的家庭列中提到。我试过了:

SELECT * FROM t JOIN (SELECT families FROM t WHERE name='A') AS z WHERE name IN (z.families)

但它不返回任何行。有什么问题?

【问题讨论】:

  • 修复你的数据模型!不要在单个列中存储多个值!
  • @Gordon 那么对我来说最好的方法是什么?如您所见,家庭不是唯一的,例如BAC 的家庭列中

标签: mysql sql database select


【解决方案1】:

你应该有一个表格,每个名字和家庭都有一行:

name   family
 A       B
 A       C
 B       A
. . . 

那么您的查询很简单:

select nf.*
from name_families nf join
     name_families nf2
     on nf2.family= nf.family and
        nf2.name = 'A' and
        nf2.name <> fn.name;

【讨论】:

  • 不幸的是,在我的情况下这绝对不可能。由于某些限制,每个人(姓名)只能有一行。
  • @Soheil 。 . .这将在一个不同的表中。
  • 是的,多对多关系可以以这种方式实现,但我们的限制是避免额外的表。我们有数百万行,而那个额外的表将创建大量的行。为什么只是存储在一列中的数据不能在我的查询中使用(就像我在问题中提到的那样)?
【解决方案2】:

在类似 tis 的自联接中使用函数 FIND_IN_SET()

SELECT DISTINCT t1.name
FROM t t1 INNER JOIN t t2
ON FIND_IN_SET(t1.name, REPLACE(t2.families, '''', ''))
WHERE t2.name = 'A'

或者:

SELECT DISTINCT t1.name
FROM t t1 INNER JOIN t t2
ON FIND_IN_SET(QUOTE(t1.name), t2.families)
WHERE t2.name = 'A'

或者没有连接:

SELECT name
FROM t 
WHERE FIND_IN_SET(QUOTE(name), (SELECT families FROM t WHERE name = 'A'))

请参阅demo
结果:

name
B
C

【讨论】:

  • 非常感谢。但是家庭列中的数据以这种格式保存:'A','B',...(注意引号!)
  • @Soheil 我没有注意到这一点,这很奇怪。请参阅我编辑的答案。
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2021-11-07
  • 2015-03-11
相关资源
最近更新 更多