4

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

我有一个包含一些fruit_type id 值的数组。

$match= array("1","5","8").

我在“水果”表中有一个单元格(fruit_type)。这个单元格的值是这样的:“1,3,9”。它包含属于该行的所有fruit_type id。

现在我想让我的 SELECT 查询返回所有有任何行的行,所有 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)。

4

2 回答 2

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 语句是什么。我很确定如果你这样做了,你会马上看到这个问题。

于 2013-01-27T18:20:08.110 回答
2

问题不在于查询,而在于数据库结构。您不应该将多个 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;
于 2013-01-28T08:31:07.017 回答