【问题标题】:Running a select on a list of comma separated values in PHP在 PHP 中的逗号分隔值列表上运行选择
【发布时间】:2012-03-07 08:39:00
【问题描述】:

我在数据库上运行选择查询时遇到了一点问题。一些数据以逗号分隔值列表的形式保存,例如:

Table: example_tbl
| Id | People | Children |
| 1  | 1,2,3  |  8,10,3  |
| 2  | 7,6,12 |  18,19,2 |

还有一个我正在尝试运行的示例:

<?php
    include 'class.php';
    $selection = 1;
    $db = new DbClass;
    $tbl_name = 'example_tbl';
    $sql = "SELECT * FROM $tbl_name WHERE ".$selection." IN People";
    $result = $db->query($sql);
    $print_r($result);
?>

上面的脚本应该在 People 列中找到“1”后返回第 1 行,但显然我把它搞砸了。

我遇到的问题是我认为我的 IN 语句是向后的,即我认为如果 $selection 是一个逗号分隔(内爆)列表,那么我认为这种方法将选择值,而不是我尝试的方式用它。

我不知道我从上面的 db 类发送和接收的内容是否太重要,但如果您想知道,它只是一个简单的脚本,运行所有相关位并返回结果数组。目前它什么也没返回,因为它没有找到匹配项

提前感谢您告诉我的任何事情。

干杯 -戴夫

【问题讨论】:

    标签: php mysql select csv


    【解决方案1】:

    为什么人们坚持在列中使用逗号分隔数据值的这种疯狂习惯,而不是正确规范他们的数据库设计。它总是会导致问题。

    SELECT * 
      FROM $tbl_name 
     WHERE CONCAT(',',People,',') LIKE '%,".$selection.",%'";
    

    SELECT * 
      FROM $tbl_name 
     WHERE FIND_IN_SET(".$selection.",People);
    

    【讨论】:

    • 不幸的是,这不是我的数据库,我正在为一个非常过时的网站上的企业做一些工作。但是干杯,这就像一个魅力。而且速度也非常快;)
    • 如果它是一个遗留数据库,那么为我扼杀原始数据库设计器:)
    • 他实际上仍在那儿工作,但他即将退休,我认为他甚至没有发出任何声音。但我还是会掐死他!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多