【问题标题】:Is it possible to loop over a comma delimited list inside a MySQL SELECT?是否可以遍历 MySQL SELECT 中的逗号分隔列表?
【发布时间】:2012-06-23 01:02:02
【问题描述】:

我需要从 MySQL 表中选择满足用户提交的尺寸/数量对的所有产品。

例如,我最终得到 ​​p>

S  = 2
M  = 2
L  = 3
XL = 1

我得到两个分隔符字符串,如下所示:

S,M,L,XL 
2,2,3,1

我的数据库查询当前位于 Coldfusion8 页面中,我只是循环遍历从两个字符串创建的二维数组并在我的 SELECT 语句中执行循环

 <cfloop from="1" to="#array.length#" index="i">
 OR  ( size = <cfqueryparam cfsqltype="cfsql_varchar" value="#var.lotArray[i][1]#"> AND qty  >= <cfqueryparam cfsqltype="cfsql_varchar" value="#var.lotArray[i][2]#"> )
 </cfloop>

问题:
有没有办法在 MySQL INSIDE a SELECT 在存储过程中执行此操作?我想我可以遍历字符串长度并在每次迭代中选择一次,但这将是很多结果集,我不确定如何将它们组合在一起。我还查看了正则表达式,但我不确定如何使用两个正则表达式字符串进行选择,并且两个字符串都需要关联(M=2,L=3...)

感谢任何提示!

【问题讨论】:

  • 通过大量使用函数也许可以做到这一点,但你的表现会很糟糕。请尊重第一个 NF(原子值)。
  • Normal Form - 这要归功于数据库规范化,“是组织关系数据库的字段和表以最小化冗余和依赖性的过程。” 以下规范化指南通常会带来更好的性能。
  • 您应该更改您的架构,或者继续像您一样在应用程序代码中执行此操作。尝试使用 mysql 执行此操作会产生极其臃肿、难以阅读且效率低下的查询。

标签: mysql regex select stored-procedures loops


【解决方案1】:

我不是很喜欢 MySQL... 似乎它不起作用。我曾希望至少能够像这样使用 ELT 遍历我的变量名:

 ELT( loopcounter, passed_sizes )

随着循环计数器从 1,2,3... 开始,passed_sizes 是一个像 'S','M','L','XL' 这样的字符串,但我想你也不能构造这样的元素.

所以我最终做了代码过多的解决方案:

BEGIN
    SELECT art.a, art.v, art.c
    FROM arts AS art
    WHERE ( (filter = '') AND (1=1)
        OR art.d = filter
        )          
    AND ( (size_1 = '') AND (1=1) OR ( art.size = size_1 AND art.qty >= qty_1 ) )
    AND ( (size_2 = '') AND (1=1) OR ( art.size = size_2 AND art.qty >= qty_2 ) )
    AND ( (size_3 = '') AND (1=1) OR ( art.size = size_3 AND art.qty >= qty_3 ) )
    AND ( (size_4 = '') AND (1=1) OR ( art.size = size_4 AND art.qty >= qty_4 ) )
    AND ( (size_5 = '') AND (1=1) OR ( art.size = size_5 AND art.qty >= qty_5 ) )
    AND ( (size_6 = '') AND (1=1) OR ( art.size = size_6 AND art.qty >= qty_6 ) )
    AND ( (size_7 = '') AND (1=1) OR ( art.size = size_7 AND art.qty >= qty_7 ) )
    AND ( (size_8 = '') AND (1=1) OR ( art.size = size_8 AND art.qty >= qty_8 ) )
    AND ( (size_9 = '') AND (1=1) OR ( art.size = size_9 AND art.qty >= qty_9 ) )
    AND ( (size_10 = '') AND (1=1) OR ( art.size = size_10 AND art.qty >= qty_10 ) )
    GROUP BY art.a, art.v, art.c
    HAVING anzahl = length;
 END

并传入 22 个参数而不是两个字符串。可读但男孩我想念易于使用的循环......如果有人知道更简单的实现,请发布作为答案。谢谢!

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 2023-02-03
    • 2013-07-03
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2023-04-06
    • 2015-03-10
    相关资源
    最近更新 更多