如何查询具有相同标签的多行,输出所有标签并按标签类别对结果进行排序?

时间:2016-04-11 19:07:39

标签: php mysql group-by tags sql-order-by

我已经在多个网站,网上商店看到了这一点,但我无法找到正确而快速的方法。

我有4张桌子:

**pv_tags:**
tag_id
tag_category_id
tag_name

**pv_tag_connections:**
tag_connection_id
tag_connection_product_id
tag_connection_tag_id

**pv_tag_categories:**
tag_category_id
tag_category_name

**pv_products:**
product_id
product_name
product_desc

编辑:SQL Fiddle here

我想要一个MySQL查询:

  • 输出所有匹配所有自定义(用户选择)标签的产品(可选择任意数量的标签)
  • 包括所找到产品的所有其他标签(每个产品可以包含任意数量的标签)
  • 按用户选择的任何标签类别(将来可能的任意类别)进行分组
  • 根据所选类别的标签名称ASC或DESC
  • 对这些组进行排序

我已经尝试了几天现在自定义这两个查询中的任何一个。他们都可以给我所选标签的结果,但我不能制作一组类别,并在其中进行排序。遗憾的是,我发现虽然group_concat有助于列出所有其他代码,但我无法将其用于分组和排序。

select * from pv_tag_connections 
INNER JOIN pv_tags ON tag_connection_tag_id = pv_tag_id
where tag_connection_product_id IN 
(
    select DISTINCT tag_connection_product_id 
    from pv_tag_connections pc 
    inner join pv_tags c on pc.tag_connection_tag_id = c.pv_tag_id
    where c.pv_tag_id in (1,46)
    group by pc.tag_connection_product_id
    having count(distinct c.pv_tag_id) = 2
)

SELECT *,
group_concat(DISTINCT pv_tags.pv_tag_name ORDER BY FIELD(pv_tags.pv_tag_category_id,'5','1','2','3','4') SEPARATOR ',') AS tag_values_for_sort,
group_concat(DISTINCT pv_tags.pv_tag_id SEPARATOR ',') AS tag_ids
FROM pv_products
INNER JOIN pv_tag_connections pvc0 ON pvc0.tag_connection_product_id = pv_products.katalogusid AND pvc0.tag_connection_tag_id IN (1) 
INNER JOIN pv_tag_connections pvc1 ON pvc1.tag_connection_product_id = pv_products.katalogusid AND pvc1.tag_connection_tag_id IN (46)
INNER JOIN pv_tag_connections ON pv_products.product_id = pv_tag_connections.tag_connection_product_id
INNER JOIN pv_tags ON pv_tag_connections.tag_connection_tag_id = pv_tags.pv_tag_id
GROUP BY product_name
ORDER BY tag_values_for_sort DESC

我不确定哪种方法更快 - 它们看起来与我类似 - 我也可以在运行查询之前在PHP中动态构建它们。我想避免的一件事是创建其他表。

示例输出如下:

User searches for
'red' - tag_id:4, tag_category_id:1
'shoe' - tag_id:8, tag_category_id:2
'group by' - tag_category_id:4 (in stock or not)
'sort by' - tag_category_id:3 (which is here adult, child, men, women etc.)

预期结果应该像

"Adioas" | "red" | "shoe" | "adult" | "in stock"
"Nile" | "red" | "shoe" | "child" | "in stock" | "20% discount"
"Nile" | "red" | "shoe" | "men" | "in stock" | "20% discount"
"Ribook" | "red" | "shoe" | "women" | "in stock" | "casual" | "with gift"
"Nile" | "red" | "shoe" | "adult" | "out of stock" | "20% discount"
"Adioas" | "red" | "shoe" | "men" | "out of stock"
"Ribook" | "red" | "shoe" | "women" | "out of stock" | "casual"

我开始认为我错过了一些明显的解决方案。

EDIT2 :我正在考虑这个问题,结果中的这些列似乎对我来说已足够了:

product_id | product_name | group_by_tag | sort_by_tag | group_concat with all used tags for the product

0 个答案:

没有答案