首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速查找同一表中是否存在一列的一个值和2或3个其他值

快速查找同一表中是否存在一列的一个值和2或3个其他值
EN

Stack Overflow用户
提问于 2022-04-07 15:48:05
回答 1查看 84关注 0票数 -1

我有三张桌子。一个用于产品,一个用于标签,另一个用于产品-标签-关联。这些标签有不同的级别,像类别和子类别一样工作,但是这些标记不是直接关联在一起的。唯一能相互连接标签(或者把一个子类别放在一个类别中)的是产品。假设我有一个id 1的产品,名为Apple iPhone 13 Pro Max,它有以下标记:

代码语言:javascript
复制
+----+---------------------+-------+
| id | name                | level |
+----+---------------------+-------+
|  1 | Telefoon            |     1 |
|  2 | Apple               |     2 |
|  3 | iPhone 13 Pro Max   |     3 |

这意味着products_tags_association表中包含以下行:

代码语言:javascript
复制
+------------+--------+
| product_id | tag_id |
+------------+--------+
|          1 |      1 |
|          1 |      2 |
|          1 |      3 |

由于这些信息的组合,我现在知道"Telefoon“标签中有"Apple”标签,而"Apple“标签中有"iPhone 13 Pro Max”标签。这就是我如何在我的网站上建立菜单。

不过,我现在遇到了一个问题,因为我在products_tags_association表中有一个有239 536行的网站。我试图创建一个分步选择工具,他们首先从第1级,然后是第2级,然后是第3级选择一个标签,但是每个级别的标签只需要是那些产品的标签,这些产品具有从上一级选择的标签。

我现在的逻辑是:

代码语言:javascript
复制
    $sql='SELECT tags.id,level, name FROM tags WHERE tags.level="'.$lvl.'";';
    $tags=getDataFromDb($sql,'id');
    if(is_array($tags) && is_array($selectedTagsByLvl) && $lvl>1){
        foreach($tags as $t=>$tg){
            $conditions='';
            if(is_array($selectedTagsByLvl)){
                foreach($selectedTagsByLvl as $l=>$tgs){
                    $conditions.=' AND id IN (SELECT product_id FROM products_tags_association WHERE product_id=products.id AND tag_id IN ('.implode(',',$tgs).'))';
                }
            }
            $sql='SELECT id FROM products WHERE online=1 AND id IN (SELECT product_id FROM products_tags_association WHERE product_id=products.id AND tag_id='.$tg['id'].') '.$conditions.' LIMIT 1;';
            if(!is_array(getDataFromDb($sql))){
                unset($tags[$t]);
            }
        }
        if(count($tags)==0){
            return NULL;
        }
    }
    return $tags;

首先,我得到所有具有我现在选择的级别的标签,然后对每个标记,我检查是否有一个产品有这个标签,再加上我在前面的步骤中选择的每个标签。我应该只能选择几个标签的每个级别。这是可行的,问题是它太慢了。

我怎样才能让这个更快?

我需要知道的是,对于当前级别,是否有一个product_id与每个所选的tag_id和tag_id的组合。也许是和product_id的团队有关?

我使用的是PHP和mysql (MariaDB)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-10 16:42:54

代码语言:javascript
复制
SELECT product_id, COUNT(*) AS ct
    FROM table
    GROUP BY product_id

然后,ct告诉您每个product_id在表中显示多少次。在HAVING ct > 1上列出不止一次出现的产品。

一般规则:当您可以在单个SQL语句中完成任务时,最好这样做,而不是将数据铲入客户端以让它完成工作。(通常编码要少得多!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71785215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档