如何在MySQL中选择包含多个值的行?

时间:2010-10-19 08:18:11

标签: mysql

我有一个MySQL表,如下所示:

Table: Designer
  id: integer  
  name: String
  gallery: string

图库行可以包含类似23,36,45

的字符串值

现在我想进行类似的查询:

SELECT * FROM Designer WHERE gallery = '36'

我知道我可以使用LIKE,但这还不够。这可能会返回36和136。

我也知道我可以创建另一个链接设计师和画廊的表格。但由于这不是一个巨大的表格,我将外国画廊ID Key添加到画廊行。 我现在很懒;)

那么如何选择编号为36的行?

更新
好吧,因为我因为糟糕的设计而被钉死(是的,我知道它是),我现在看到了显而易见的。

设计师可以拥有许多画廊,但画廊只能属于一个设计师。 因此,我只需要将设计器ID作为外键添加到库表中。

简单。但是在凌晨3点并且你已经工作了15个小时并不总是合乎逻辑的;)

4 个答案:

答案 0 :(得分:3)

如果你必须这样做,你的桌子设计很差。

一个设计师可以拥有许多画廊,一个画廊属于一个设计师意味着你必须在“画廊”表中创建一个外键“设计师”,你的请求将是

SELECT *
FROM Designer
INNER JOIN Gallery
ON Gallery.id = 36
AND Designer.id = Gallery.designer

答案 1 :(得分:2)

我也同意这是一个设计不佳的表结构,但这里是答案

SELECT * FROM Designer where FIND_IN_SET(36,gallery)

答案 2 :(得分:1)

你真的不应该存储这样的数据,因为它会使查询效率极低。对于该特定用例,您可以(如果您不关心性能)使用:

select * from designer
    where gallery like '36,%'
       or gallery like '%,36'
       or gallery like '%,36,%'
       or gallery = '36'

这可以减轻您对部分匹配的担忧,因为136之类的内容不符合任何条件,但任何位置的36都会匹配。


然而,尽管你提出了相反的抗议,你应该做的是重新设计你的架构,例如:

designer:
    id             integer primary key
    name           varchar(whatever)
designer_galeries:
    designer_id    integer foreign key references designer(id)
    gallery        string
    primary key    (designer_id,gallery)

然后你的查询将非常快。您应该了解的第一个第一个事项之一就是始终为第三范式设计架构。一旦理解了权衡(并知道如何缓解问题),就可以恢复其他形式的表现,但除非你的数据库非常复杂,否则很少有必要。

答案 3 :(得分:-2)

您可以在WHERE子句中使用正则表达式。

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

SELECT * FROM Designer WHERE gallery REGEXP "(,|^)(36)(,|$)"