匹配MySQL查询中的数组值

时间:2013-01-27 18:16:51

标签: php mysql

我将用一个水果示例说明我的问题:

我有一个数组,其中包含一些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)中的任何值。

2 个答案:

答案 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;