【问题标题】:Syntax for db columns with comma separated lists - mySQL `IN` operator带有逗号分隔列表的 db 列的语法 - mySQL `IN` 运算符
【发布时间】:2014-11-07 20:16:20
【问题描述】:

当在SELECTstatement 中使用IN 运算符时,当subquery 中的db 列名称包含逗号分隔列表(在任一列或两列中)时,正确的语法是什么?

在下面的 sn-p 中,我正在尝试识别以客户喜欢的颜色提供的产品(任一列中都可以有一个或多个值)

SELECT * FROM products WHERE products.Colors IN (SELECT style.colors_love FROM style WHERE user_id = $user_id)

这种格式适用于硬编码列表:

$colors_love = "'Black','Royal_Blue','Dodger_Blue','Red'";
SELECT * FROM products WHERE products.Color IN ('$colors_love') 

我已经尝试了所有我能想到的方法,包括将其声明为 array 并尝试连接这些值,并且由于我的编码有点生疏,我觉得我的语法有点不对劲。

【问题讨论】:

  • 您的第一个选择似乎是正确的想法,但它引用了customers.Colors_Prefer,但不包括customers 表。从style 表中拉出customers.Colors_Prefer 是什么意思?
  • @lurker - 我的错 - 这是我在清理 sn-p 以发布问题时犯的错字 :-( 感谢您发现 ;-)
  • 第一个 SELECT 是否以某种方式失败?如果是这样,错误是什么?
  • @lurker - 它是 ;-) 更复杂的是,即使错误报告已打开,它也不会给我一个错误代码,并且它确实正确地到达了页面底部(因为它回显了所有内容页面上的其他内容)
  • @Strawberry - 我的印象是“加入”仅用于以某种方式连接的表(即用外键连接表)。是否也用于数据未连接的表?

标签: mysql arrays subquery in-operator


【解决方案1】:
SELECT p.* 
  FROM products p
  JOIN customers c 
    ON c.Colors_Prefer = p.colors 
 WHERE c.user_id = $user_id;

如果我们考虑首选颜色的示例,标准化方法可能如下所示:

user preferred_colour 
bob  red
bob  yellow
mike red
mike green
dave turquoise

如果您想以这种方式存储数百个属性,那么 EAV 方法可能是合适的:

user attribute value
bob  colour    red
bob  colour    yellow
mike colour    red
mike colour    green
dave colour    turquoise
dave vehicle   bicycle
dave vehicle   car
bob  vehicle   train

但如果这样做,我仍然很想为每种不同的数据类型创建不同的表 - 因此,至少,一个用于数字类型属性的表和一个用于字符串类型属性的表。

【讨论】:

  • 我的印象是“join”仅用于以某种方式连接的表(即用外键连接表)。它是否也用于数据未连接的表?在这个例子中,我试图识别有客户喜欢的颜色可供选择的产品
  • 你是对的。我忘记提到的部分是要求放弃逗号分隔的列表。而是查看规范化
  • 我不熟悉规范化和缺少逗号分隔列表相交的方式 :-( 但是,在这种特殊情况下,我认为摆脱逗号分隔的列表,因为这需要为每个可能的值使用单独的列(即,他们喜欢的颜色不是 1 列,而是 200 多种颜色中的每一种都必须有 1 列,每一个颜色也是如此我们正在捕获的样式属性)。它还需要完全重做网站的大部分内容,所以目前我必须按原样使用数据库。
  • 没有。每个值都需要单独的行 - 在单独的表中。这就是标准化。
  • 你能解释一下为什么这很重要吗?只是为了澄清一下,对于每个客户,我目前都在 apx 上捕获信息。 400 个属性(即 Colors_Prefer),并且大多数属性都有下注。 100-300 个可能的值(即 200 多种颜色)。目前属性被拆分成几个表,每个客户都在单独的一行(我使用外键将客户的数据连接到他们的id)。
猜你喜欢
  • 2011-05-09
  • 2021-05-13
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多