【问题标题】:How to make MySQL filter using a combination of categories and tags如何使用类别和标签的组合制作 MySQL 过滤器
【发布时间】:2016-08-22 12:37:01
【问题描述】:

我正在尝试制作一个两步过滤器,以使用产品类别和产品标签对产品进行排序。

一个产品可以有多个类别和多个标签。

但是,当时只能选择一个类别。用户选择类别后,我只想显示所选类别中包含产品的标签。

例如: 输入 类别 = 汽车 输出 标签 = 宝马、福特

表格:

CREATE TABLE product(
    id INT auto_increment primary key,
    name varchar(255)
);

CREATE TABLE tags(
    id INT auto_increment primary key,
    tag_name varchar(255)
);

CREATE TABLE product_tags(
    id INT auto_increment primary key,
    tag_id INT,
    product_id INT
);

CREATE TABLE product_categories(
    id INT auto_increment primary key,
    category_name varchar(255),
);

CREATE TABLE categories(
    id INT auto_increment primary key,
    category_id INT,
    product_id INT
);

我尝试了几种解决方案,但无法做出一个显示正确组合的查询。

SELECT tags.id,tags.tag_name
FROM tags,product_tags,product_categories
WHERE product_tags.product_id IN (
    SELECT product_id
    FROM categories
    WHERE product_categories.id = (
        SELECT id
        FROM category
        WHERE id = 3)
)
GROUP BY tags.tag_id

【问题讨论】:

  • 您尝试过哪些解决方案最接近您想要的?它有什么问题?
  • SELECT tags.tag_id,tag_types.tag FROM tags,tag_types,category WHERE tags.item_id IN ( SELECT product_id FROM categories WHERE category_id = ( SELECT id FROM category WHERE name = 3) ) GROUP BY 标签。 tag_id
  • 有数百种排列吗?
  • 我认为 product_categories 和 categories 表名是互换的;这令人困惑。在表格格式中提供表格数据和所需的结果集,然后只有我可以编写正确的查询。
  • 我更改了相关表的名称以简化它,并错误地复制了我的原始查询。这是具有正确表名的查询。 SELECT tags.id,tags.tag_name FROM tags,product_tags,product_categories WHERE product_tags.product_id IN (SELECT product_id FROM categories WHERE product_categories.id = (SELECT id FROM category WHERE id = 3)) GROUP BY tags.tag_id

标签: mysql inner-join multiple-select-query


【解决方案1】:

试试这个:

select 
distinct(t.tag_name)
from tags t
join product_categories pc on pc.category_name = 'Car'
join categories c on c.category_id = pc.id
join product_tags pt on pt.tag_id = t.id and pt.product_id = pc.id

【讨论】:

    【解决方案2】:

    这应该可以正常工作

    select disticnt t.*
    from tags t
    join product_categories pc on pc.category_name = 'Car'
    join categories on c.category_id = pc.category_id and c.product_id = p.id
    join product_tags pt on pt.tag_id = t.id and pt.product_id = p.id
    

    【讨论】:

    • 我想输出在所选产品类别中有产品的标签。看起来该查询将输出标签已知/已设置的产品列表
    • 然后你可以用标签交换表产品。
    • 谢谢。我假设您打算写 t.id 而不是 p.id。不幸的是,当我运行代码时,我得到 0 个结果。但我认为它非常接近我的需要。
    • @sdfgg45 :奇怪,提问者得到了线索,你说还没有接近 :(
    • 假设它需要实际进行演示测试,然后做出正确的陈述。
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2020-03-05
    • 2012-12-21
    • 1970-01-01
    • 2018-08-07
    • 2011-08-23
    • 2014-12-12
    相关资源
    最近更新 更多