【问题标题】:How to get the cartesian product in MySQL for a single table如何在 MySQL 中为单个表获取笛卡尔积
【发布时间】:2010-11-06 13:17:15
【问题描述】:

首先声明:我正在处理一个具有非常奇怪架构的遗留数据库。另外,我是一个完整的 SQL 菜鸟,所以这也无济于事。

基本上,我有一张包含产品变体的表格。一个很好的例子可能是 T 恤。 “通用” T 恤有一个产品 ID。每种类型的变化(大小、颜色)都有一个 id。变化的每个值(红色,小)都有一个 id。

所以表格看起来像:

 +----+----------+-----------+-------------+----------+------------+
 | id | tshirt   | option_id | option_name | value_id | value_name |
 +----+----------+-----------+-------------+----------+------------+
 | 1  | Zombies! | 2         | color       | 13       | red        |
 | 1  | Zombies! | 2         | color       | 24       | black      |
 | 1  | Zombies! | 3         | size        | 35       | small      |
 | 1  | Zombies! | 3         | size        | 36       | medium     |
 | 1  | Zombies! | 3         | size        | 56       | large      |
 | 2  | Ninja!   | 2         | color       | 24       | black      |
 | 2  | Ninja!   | 3         | size        | 35       | small      |
 +----+----------+-----------+-------------+----------+------------+

我想编写一个查询来检索给定产品的不同组合。

在此示例中,僵尸衬衫有红色/小号、红色/中号、红色/大号、黑色/小号、黑色/中号和黑色/大号(六种款式)。 Ninja 衬衫只有一种变化:黑色/小号。

我相信这是尺寸和颜色的笛卡尔积。

这些 id 确实是其他表的外键,所以为了清楚起见,这些名称/值不是但想包括在内。

选项的数量可以变化(不限于两个),每个选项的值的数量也可以变化。最终,给定产品的数字可能会很小,所以我不担心这里有数百万行。

关于我如何做到这一点的任何想法?

谢谢, p.

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试这个:

    select 
     f.id,
     f.tshirt,
     color.option_id as color_option_id,
     color.option_name as color_option_name,
     color.value_id as color_value_id,
     color.value_name as color_value_name,
     size.option_id as size_option_id,
     size.option_name as size_option_name,
     size.value_id as size_value_id,
     size.value_name as size_value_name
    from 
     foo f
    inner join foo color on f.id = color.id and f.value_id = color.value_id and color.option_id = 2 
    inner join foo size on f.id = size.id and size.option_id = 3
    order by 
     f.id, 
     color.option_id, color.value_id, 
     size.value_id, size.value_id;
    

    【讨论】:

    • 成功了,尽管它似乎只处理两个变量(在这种情况下为大小/颜色)。虽然现在我需要弄清楚如何在不破坏结果的情况下查找这些外键。谢谢!
    【解决方案2】:

    看起来distinct 可以解决问题:

    select  distinct tshirt
    ,       option_name
    ,       value_name
    from    YourTable
    

    【讨论】:

    • 这只会检索两行(忍者和僵尸),而在给定的示例中我需要七行。
    猜你喜欢
    • 2013-07-14
    • 2015-01-15
    • 2015-07-29
    • 2023-02-19
    • 2022-01-10
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多