【问题标题】:Mysql sorting concated valuesMysql对连接值进行排序
【发布时间】:2015-04-29 11:08:09
【问题描述】:

我有 3 个 mysql 表(动物、类别和动物_2_类别)。 每个动物都可以有 0-n 个类别(例如鱼、宠物、昆虫、食肉动物、“会飞”等)。

表格“动物”(id、名称)

1, dog
2, cat
3, bee
...

表格“类别”(id、名称)

1, pet
2, insect
3, mammal
4, fish
5, can fly
...

表“animal_2_category”(animal_id、category_id)

1, 1
1, 3
2, 1
2, 3
3, 2
3, 5
...

我现在需要的是所有类别组合的列表。 以下查询有效:

SELECT CONCAT_WS("-", x.name, c.name)
FROM animal_2_category a2c1 
    JOIN animal_2_category a2c2 ON a2c1.animal_id = a2c2.animal_id
    JOIN category c ON c.id = a2c2.category_id´
    JOIN categories x
GROUP BY a2c2.category_id

此查询将返回以下内容:

  • 宠物哺乳动物
  • 哺乳动物-宠物
  • 昆虫会飞

问题在于,我得到了重复的条目“pet-mammal”和“mammal-pet”。 如何修改查询,只获取其中一个,例如:

  • 宠物哺乳动物
  • 昆虫会飞

【问题讨论】:

  • 无需连接这些数据。事实上,粗略的估计,在 SQL 中没有问题需要 CONCAT 或 GROUP_CONCAT 作为答案的一部分。
  • 只需添加一个要求,一个结果的id必须低于另一个结果的id。

标签: php mysql


【解决方案1】:

您也可以将查询重写为

SELECT  DISTINCT GREATEST(CONCAT_WS("-", x.name, c.name),CONCAT_WS("-", c.name, x.name)) col
FROM animal_2_category a2c1 
    JOIN animal_2_category a2c2 ON a2c1.animal_id = a2c2.animal_id
    JOIN categories c ON c.id = a2c2.`category_id`
    JOIN categories `x` ON a2c1.category_id = x.id
    WHERE x.name <> c.name

DEMO

【讨论】:

    【解决方案2】:

    避免重复配对的一种方法是确保您的配对始终以相同的顺序创建。我们可以通过在 if 语句中组装你的对来做到这一点,它有效地为我们对两个值进行排序。然后我们只抓取不同的行。

    select distinct if(c1.name > c2.name, concat_ws('-', c1.name, c2.name), concat_ws('-', c2.name, c1.name)) pairing
      from animal_2_category a1
        inner join animal_2_category a2
          on a1.animal_id = a2.animal_id
            and a1.category_id <> a2.category_id
        inner join categories c1
          on a1.category_id = c1.id
        inner join categories c2
          on a2.category_id = c2.id;
    

    或者,只是在加入条件中更具选择性,因此它们只按特定顺序加入。这避免了 if,但我们仍然需要获取不同的值。

     select distinct concat_ws('-', c1.name, c2.name) pairing
      from animal_2_category a1
        inner join animal_2_category a2
          on a1.animal_id = a2.animal_id
            and a1.category_id < a2.category_id
        inner join categories c1
          on a1.category_id = c1.id
        inner join categories c2
          on a2.category_id = c2.id;
    

    demo here

    不管怎样,结果都是一样的。

    【讨论】:

      【解决方案3】:
      SELECT DISTINCT combos
      FROM (
        SELECT animal_id
        , GROUP_CONCAT(c.name ORDER BY c.name SERPERATOR '-') AS combos  
        FROM animal_2_category a2c
        JOIN category c ON c.id = a2c.category_id 
        GROUP BY animal_id
      ) AS ilv
      

      【讨论】:

      • 如果他希望显示单个类别以及类别配对,这很好,否则它需要一些having 爱。
      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 2012-06-18
      • 2017-03-11
      • 2017-05-10
      • 2021-02-11
      • 2023-03-19
      • 2012-07-12
      相关资源
      最近更新 更多