Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中选择包含多个值的行?_Mysql - Fatal编程技术网

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

如何在MySQL中选择包含多个值的行?,mysql,Mysql,我有一个MySQL表,如下所示: Table: Designer id: integer name: String gallery: string gallery行可以包含一个字符串值,如23,36,45 现在我想做一个类似的查询: SELECT * FROM Designer WHERE gallery = '36' 我知道我可以像那样使用,但这还不够精确。这可能会返回36和136 我还知道我可以创建另一个链接designer和gallery的表。但是,由于这不是一个巨大的

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

Table: Designer
  id: integer  
  name: String
  gallery: string
gallery行可以包含一个字符串值,如
23,36,45

现在我想做一个类似的查询:

SELECT * FROM Designer WHERE gallery = '36'
我知道我可以像那样使用
,但这还不够精确。这可能会返回36和136

我还知道我可以创建另一个链接designer和gallery的表。但是,由于这不是一个巨大的表,我将向gallery行添加foreign gallery ID键我现在很懒;)

那么,如何选择一个编号为36的行呢

更新
好吧,既然我因为糟糕的设计而被钉死(是的,我知道是这样),我现在看到了显而易见的事实

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


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

如果你不得不这么做,你的桌子设计得很糟糕

一个设计器可以有多个库,而一个库属于一个设计器意味着您必须在“库”表中创建外键“设计器”,您的请求将被删除

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

如果你不得不这么做,你的桌子设计得很糟糕

一个设计器可以有多个库,而一个库属于一个设计器意味着您必须在“库”表中创建外键“设计器”,您的请求将被删除

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

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

这将减轻您对部分匹配的担忧,因为类似于
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)

那么你的查询速度就会快得令人眼花缭乱。您应该学习的第一件事是始终为第三范式设计模式。一旦您了解了折衷(并知道如何缓解问题),就可以恢复到其他形式以获得性能,但除非您的数据库非常复杂,否则几乎没有必要这样做。

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

这将减轻您对部分匹配的担忧,因为类似于
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)

那么你的查询速度就会快得令人眼花缭乱。您应该学习的第一件事是始终为第三范式设计模式。一旦您了解了折衷方法(并知道如何缓解问题),就可以恢复到其他形式以获得性能,但除非您的数据库非常复杂,否则几乎没有必要这样做。

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


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


我也同意这是一个设计拙劣的表结构,但下面是答案

SELECT * FROM Designer where FIND_IN_SET(36,gallery)

我也同意这是一个设计拙劣的表结构,但下面是答案

SELECT * FROM Designer where FIND_IN_SET(36,gallery)

MySQL中永远不要有包含多个值的行。但是制作另一个包含多行的表,链接到此行。嗯。。。我不确定是谁在这里否决了所有的答案……@Col-是的,我知道。但我现在也很懒:)不管是谁投了反对票,都能停止这样做吗?MySQL中永远不要有一行包含多个值。但是制作另一个包含多行的表,链接到此行。嗯。。。我不确定是谁在这里否决了所有的答案……@Col-是的,我知道。但是我现在也很懒:)否决答案的人能停止这样做吗?有些人否决了答案,如果答案有效,请投赞成票:)有些人否决了答案,如果答案有效,请投赞成票:)不,画廊只能属于一个设计师。但是一个设计师可以拥有许多画廊。请看我的更新。我认为在这里使用内部连接太过分了。只需从Designer中选择*,gallery WHERE Designer.id=gallery.fk_Designer_id
即可轻松完成。这是关于连接语法的,建议使用我的语法,否则这是同一查询。不,gallery只能属于一个设计师。但是一个设计师可以拥有许多画廊。请看我的更新。我认为在这里使用内部连接太过分了。只需从Designer,gallery WHERE Designer.id=gallery.fk_Designer_id中选择*就容易多了。这是关于连接语法,建议使用我的连接语法,否则这是相同的查询。我非常擅长I DB设计,我知道这是一个糟糕的设计。但我想得太累了(在设计时没有用笔和纸)。所以,是的,在gallery表中添加外键是迄今为止最好的解决方案@史蒂文,如果你不太在意性能,你可以使用第一种解决方案。例如,如果您知道您的表永远不会超过100行,并且不会遇到超过几个并发查询,那么这是完全可以接受的,因为在这种情况下,您可能不需要专业的DBMS性能。那是雅格尼踢进来的。只是,根据我的经验,桌子从来没有你想象的那么小:-)他,他-你是对的。这是为了在网站上展示时装设计师。虽然我有大约60名设计师,但许多ppl都在打开页面查看图库并浏览设计师信息。在淡季,我可能每周有10-20次。但在时装周期间,我一天可能有2000英镑:)我很擅长DB设计,我知道这是个糟糕的设计。但我想得太累了(在设计时没有用笔和纸)。因此,是的,增加了外国投资