多对多的表,并使用数组查询相同的变量

时间:2009-11-03 03:55:54

标签: mysql many-to-many

已解决 - 请参阅下面的Bish

我有一个所有转储到$ fruitid []和多对多table1的复选框列表:

BoxID  FruitID
 01      01
 01      02
 02      01
 02      03
 02      04
 03      02
 etc.     etc.

我希望用户选中他们想要的每个水果旁边的框,然后查询以提取包含所有水果选择的每个框的列表(其他水果可以,这是最低要求,而不是精确的内容搜索。)

我的PHP工作得很好,但我对我认为简单的MySQL字符串感到困惑。基本上如果我

SELECT boxid FROM table1 WHERE fruitid=$fruitid1 AND fruitid=$fruitid2 AND etc. 

直到输入所有已检查的数据我最终没有结果,因为没有SINGLE行包含多个fruitid。这有意义吗?

我能想到的唯一解决方案是一堆嵌套的select语句,每个语句都缩小了前一个子集中的结果池,直到你搜索原始数组中的所有值。这似乎是CPU密集型和代码繁琐。

有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

如果你将你的AND改为OR,我想你会做你正在做的事情。从概念上讲,将select读作“选择具有property1 AND property2 AND ...”的行,而不是“选择具有property1的行,还选择具有property2的行,等等。”

编辑:更紧凑,你可以使用

SELECT boxid FROM table1 WHERE fruitid IN ($fruitid1,$fruitid2,...)

答案 1 :(得分:1)

您可能想要重新考虑您的数据库(或者我不确定您在尝试什么)。但是从你发布的SQL看起来你可以这样做:

SELECT boxid FROM table1 WHERE fruitid in ($fruitid1,$fruitid2);

答案 2 :(得分:1)

在当前建议的基础上,您应该只需添加GROUP BY和HAVING子句即可获得所需内容:

SELECT boxid FROM table1 WHERE fruitid IN ($fruitid1, $fruitid2, ...) GROUP BY boxid HAVING COUNT(*) = $selectedFruitCount;

通过boxid分组并添加COUNT(),您可以获得每个框包含的“有趣”水果数量。如果该计数等于所选择的水果总数,那么该方框必须包含每个选定的水果(可能还有更多)。请记住,这假设boxid和fruitid的组合是唯一的。

答案 3 :(得分:1)

SELECT boxid FROM table1 
WHERE fruitid IN ($fruitid1, $fruitid2,)

你能给出你想要的更多解释吗?从你的问题我明白我认为这应该有效。