我有一个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个小时并不总是合乎逻辑的;)
答案 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)(,|$)"