【发布时间】:2009-10-20 09:09:01
【问题描述】:
(已解决,见完)
我需要有关 PHP 或 MySQL 代码结构的提示:
假设您有 X 个独特的盒子和 Y 种水果。每个盒子可以包含每种水果中的一种。有些盒子可能只有 2 种类型,有些可能每种类型都有。所有的盒子都至少有一种类型。
对于查询,用户有一个复选框列表,每个复选框对应一种水果。 (我假设这些都输入到同一个查询数组中?)
我的问题从这里开始:
如果用户检查
苹果、橙子和葡萄
如何构造查询以返回以下内容:
Box01(苹果、橙子)
Box02(葡萄)
Box03(苹果、橙子、葡萄)
但不是:
Box04(苹果、橙子、葡萄、梨、香蕉)
如何将返回限制为包含 $fruit[] 或更少的所有给定值的记录,但不包含任何其他值,即使请求的值存在?另外,这种查询是否有一个特殊的名称可供我将来参考?
这对我来说真的很难,非常感谢您的时间。
- 一个
(PS - 你不必担心格式化输出或类似的东西,这只是为了说明这个概念。我对查询代码非常感兴趣。)
编辑 - 有两个人问过,很抱歉没有进入具体的 dbase 细节。我有 3 个表:一个描述每个盒子,一个描述每个水果,以及一个包含 2 列的多对多表 - boxids 和 fruitids。我相信这就是你们俩的假设。
谢谢大家!
我的解决方案
Anax 下面的代码帮助了我,这就是我最终做的:
table "box" 有列 "boxid" (primary key) & "box description" 表“fruit”有列“fruitid”(主键)和“fruit description” 表“box_has”有列“boxid”和“fruitid”
SELECT boxid FROM box WHERE
boxid NOT IN (
SELECT boxid FROM box_has WHERE fruitid NOT IN ('F01' , 'F02'))
从后往前看代码,最里面的 SELECT 找到所有有水果的盒子 OTHER 不是我们想要的,不包括那些有我们想要的和其他的麻烦的盒子。
然后,外部选择使用 box 表,其中每个 boxid 只出现一次,以获得单个盒子的干净返回,而不会重复包含任何选定的水果。
谢谢大家的帮助!
【问题讨论】: