我有三张桌子。一个用于产品,一个用于标签,另一个用于产品-标签-关联。这些标签有不同的级别,像类别和子类别一样工作,但是这些标记不是直接关联在一起的。唯一能相互连接标签(或者把一个子类别放在一个类别中)的是产品。假设我有一个id 1的产品,名为Apple iPhone 13 Pro Max,它有以下标记:
+----+---------------------+-------+
| id | name | level |
+----+---------------------+-------+
| 1 | Telefoon | 1 |
| 2 | Apple | 2 |
| 3 | iPhone 13 Pro Max | 3 |这意味着products_tags_association表中包含以下行:
+------------+--------+
| 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级选择一个标签,但是每个级别的标签只需要是那些产品的标签,这些产品具有从上一级选择的标签。
我现在的逻辑是:
$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)
发布于 2022-04-10 16:42:54
SELECT product_id, COUNT(*) AS ct
FROM table
GROUP BY product_id然后,ct告诉您每个product_id在表中显示多少次。在HAVING ct > 1上列出不止一次出现的产品。
一般规则:当您可以在单个SQL语句中完成任务时,最好这样做,而不是将数据铲入客户端以让它完成工作。(通常编码要少得多!)
https://stackoverflow.com/questions/71785215
复制相似问题