我将用一个水果示例说明我的问题:
我有一个数组,其中包含一些fruit_type id的值。
$match= array("1","5","8").
表'fruit'中有一个单元格(fruit_type)。 这个单元格的值是这样的:“1,3,9”。它包含属于此行的所有fruit_type id。
现在我想让我的SELECT查询返回所有具有any的行,即所有id为1,5或8的组合。
此查询不起作用,因为只有当单元格值为“1,5,8”且不是1或5或8(或它们的组合或全部)时,此查询才有效:
SELECT * FROM fruit WHERE fruit_type IN ('".implode("','",$match)."')
有什么想法吗?
编辑(我认为问题不够清楚.. 所以我在这个例子中想要的是: 一个查询将匹配任何(单元格)值1或3或9中的任何值与$ match(1或5或8)中的任何值。答案 0 :(得分:5)
当您执行此操作时,您正在用引号括起内幕中的每个单独数字:
SELECT * FROM fruit WHERE fruit_type IN ('" . implode("','",$match) . "')
结果查询如下所示:
SELECT * FROM fruit WHERE fruit_type IN ('1','5','8')
所以它应该是:
SELECT * FROM fruit WHERE fruit_type IN (" . implode(",",$match) . ")
因此生成的查询如下所示:
SELECT * FROM fruit WHERE fruit_type IN (1,5,8)
此外,如果您在PHP中执行此操作,那么我建议在处理之前只需echo
输出我的DB命令以实际查看最终的MySQL语句是什么。我很确定你是否已经完成了你会立即看到这个问题。
答案 1 :(得分:0)
问题不在于查询,而在于DB结构。您不应该在一个列中放置多个ID(至少在您要对其进行查询时不会这样)。你可以让它工作,但它总是很慢。
而不是列fruit_type
,您应该有一个表fruit_type
。
CREATE TABLE fruit_fruittype (fruit_id INT, fruit_type_id INT, PRIMARY KEY (`fruit_id`,`fruit_type_id`));
为每个水果添加一个水果类型的行。
现在您可以轻松查询水果的类型:
SELECT fruit.* FROM fruit INNER JOIN fruit_fruittype ON fruit.id = fruit_fruittype.fruit_id WHERE fruit_type_id IN (1, 5, 8) GROUP BY fruit.id;