我在数据库上运行select查询时遇到了一些问题。一些数据保存为逗号分隔值列表,例如:
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类发送和接收的内容是否过于重要,但如果您想知道,它只是一个运行所有相关位并返回结果数组的简单脚本。目前它没有返回任何东西,因为它找不到匹配
提前感谢你能告诉我的任何事情。
干杯 -Dave
答案 0 :(得分:16)
为什么人们坚持这种疯狂的习惯,即在列中使用逗号分隔的数据值,而不是正确地规范化他们的数据库设计。 始终 会导致问题。
SELECT *
FROM $tbl_name
WHERE CONCAT(',',People,',') LIKE '%,".$selection.",%'";
或
SELECT *
FROM $tbl_name
WHERE FIND_IN_SET(".$selection.",People);