【问题标题】:mysql & php - query for record with all or fewer values, but not moremysql & php - 查询所有或更少值的记录,但不多
【发布时间】: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 只出现一次,以获得单个盒子的干净返回,而不会重复包含任何选定的水果。

谢谢大家的帮助!

【问题讨论】:

    标签: php mysql forms


    【解决方案1】:

    您需要三张桌子:一张放篮子,一张放水果,第三张将篮子和水果连接起来(多对多)。

    鉴于此,您可以通过运行如下查询来获得所需的结果:

    SELECT baskets.* FROM baskets, fruits, baskets_and_fruits
    
    WHERE baskets.id = baskets_and_fruits.basketID AND
        fruits.id = baskets_and_fruits.fruitID AND
        AND baskets.id NOT IN
        (
            SELECT baskets.id FROM baskets, fruits, baskets_and_fruits
            WHERE baskets.id = baskets_and_fruits.basketID AND
                fruits.id = baskets_and_fruits.fruitID AND
                fruits.name NOT IN ('apples', 'oranges', 'grapes')
        )
    

    【讨论】:

    • 我将把答案归功于这里,因为虽然我无法让您列出的代码运行,但通过阅读获得的概念性想法足以让我找出解决方案,我现在已将其包含在上述问题的末尾。
    【解决方案2】:

    怎么样

    SELECT * FROM box WHERE boxId NOT IN (
      SELECT * boxId FROM box WHERE fruit NOT IN ("apples", "oranges", "grapes"));
    

    【讨论】:

      【解决方案3】:

      问题是您的 MySQL 数据库是如何布局的?

      假设您有一个表 boxes 和一个表 fruits 和一个链接器表 box_fruit_linker 链接内容:

      SELECT * FROM 框
          左连接 box_fruit_linker 使用(box_id)
          左连接水果使用(fruit_id)
          WHERE(fruits.name = 'apples' OR fruits.name = 'grapes' OR fruits.name = 'oranges')
          GROUP BY box.box_id;

      您的查询的 WHERE 部分可以很容易地在 PHP 中通过遍历复选框数组并使用 implode(' OR ', $checked_boxes) 来组合。

      【讨论】:

      • 刚刚对此进行了测试,它不排除除了所选水果之外还有其他类型水果的盒子,这就是问题的核心。
      【解决方案4】:

      Select * from box where boxId NOT IN (Select boxId from boxes where fruitType = 'grape' or fruitType = 'apples' or fruitType='oranges');

      这可能不是您正在寻找的确切代码,但这个想法可能会帮助您...

      【讨论】:

        【解决方案5】:
        <?php
        $boxes = array(
            array(
                'apples',
                'oranges'
            ),
            array(
                'grapes',
            ),
            array(
                'apples',
                'oranges',
                'grapes'
            ),
            array(
                'apples',
                'oranges',
                'grapes',
                'pears',
                'bananas'
            )
        );
        
        $search = array(
            'apples',
            'oranges',
            'grapes'
        );
        
        foreach ($boxes AS $box)
        {
            $notinsearch = array_diff($box, $search);
        
            if (empty($notinsearch))
            {
                print_r($box);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          • 1970-01-01
          • 2020-07-19
          • 1970-01-01
          相关资源
          最近更新 更多