PHP,MySQL 选择,按字段排序并分组

Posted

技术标签:

【中文标题】PHP,MySQL 选择,按字段排序并分组【英文标题】:PHP, MySQL select, order by field and group it 【发布时间】:2017-06-17 13:01:32 【问题描述】:

欢迎!

我的 SQL 查询有问题。

我的每个用户都有一个带有查看标签的独特表格。我想向他展示什么能引起他的兴趣,但我无法应付对数据库的查询...

用户 X 有标签:

tag_id 8 viewed 150 times
tag_id 11 viewed 100 times
tag_id 12 viewed 80 times

这是我的查询

SELECT c.id AS cid, c.value, t.id AS tag_id, t.value AS tag_name 
FROM components c 
JOIN connect_tag_com ctc ON ctc.component_id = c.id 
JOIN tags t ON t.id = ctc.tag_id 
WHERE t.id IN('8', '11', '12') 
ORDER BY FIELD (t.id, '8', '11', '12') ASC, c.id DESC

到这个数据库:http://sqlfiddle.com/#!9/904d1a/6

结果:

| id |                   value | id |      value |
|----|-------------------------|----|------------|
|  8 | article about beetroots |  8 | refreshing |
|  7 |     article about pears |  8 | refreshing |
|  5 |    article about apples |  8 | refreshing |
|  4 |  article about cucumber |  8 | refreshing |
|  1 |   article about carrots |  8 | refreshing |
|  8 | article about beetroots | 11 |      sweet |
|  7 |     article about pears | 11 |      sweet |
|  6 |   article about berries | 11 |      sweet |
|  3 |   article about bananas | 11 |      sweet |
|  1 |   article about carrots | 11 |      sweet |
|  8 | article about beetroots | 12 | wegetables |
|  4 |  article about cucumber | 12 | wegetables |
|  2 |    article about onions | 12 | wegetables |
|  1 |   article about carrots | 12 | wegetables |

现在我仍然只按 c.id 组件分组,不幸的是这破坏了整个哲学,因为查询的任务是按照我的观看标签顺序查找材料。因此,如果 c.id 4 具有 标签 8 和 12,则作为查询的结果应该收到仅带有搜索标签的 c.id 4首先,标签 8。第二个标签 - 12 被省略。

你明白了吗?

这就是我所说的:

对于标签:8、11、12

|c.id|                   value |t.id|      value |
|----|-------------------------|----|------------|
|  8 | article about beetroots |  8 | refreshing |
|  7 |     article about pears |  8 | refreshing |
|  5 |    article about apples |  8 | refreshing |
|  4 |  article about cucumber |  8 | refreshing |
|  1 |   article about carrots |  8 | refreshing |
|  6 |   article about berries | 11 |      sweet |
|  3 |   article about bananas | 11 |      sweet |
|  2 |    article about onions | 12 | wegetables |

只有唯一的 ID。我知道我可以用 SUBQUERY 做到这一点,但我不知道该怎么做。你能帮忙吗?

祝你有美好的一天!

【问题讨论】:

我不明白 :-( 知道了 :) 我想获得一个唯一的 c.ID,以便为 t.ID。如果之前选择了 c.ID,则进一步跳过它。每个 c.ID 可以有多个标签,如果标签稍后再去跳过,并且只归属于第一次。现在你明白了吗?请分析以上附表。谢谢! 不。我还是不明白。你能用波兰语总结一下吗? Potrzebuję wybrać z bazy artykuły wg.流行的ności 塔古。 NP。 userX oglądał artykuły najczęściej z tagami: 8, 11 i 12, teraz chcę z bazy wybrać artykuły wg właśnie tej kolejności。 Zatem najpierw artykuły z tagiem 8, później (bez powtórzeń ID) tag 11 i na koniec artykuły z tagiem 12. Jeśli artykuł posiada tag 8 i 11, to wybieram go z tagiem 8, a z 11 pomijam。 Tak jakby sortuję 去 wg。 Priorytetów jakie posiadam。 Podsumowując, potrzebuję wybrać z listy artykuły w kolejności zainteresowania tagiem。 啊,好的,我现在明白了。不知何故,我以前看不到您所说的重复是什么意思。选择的标签是否超过 3 个? 【参考方案1】:

我确信这里的子查询比绝对必要的要多,但由于某种原因,没有它们我无法让它工作......

SELECT cid
     , value
     , tag_id
     , tag_name
  FROM 
     ( SELECT cid
     , value
     , tag_id
     , tag_name
     , CASE WHEN @prev = cid THEN @i:=@i+1 ELSE @i:=1 END i
     , @prev := cid
  FROM 
     ( SELECT c.id cid
            , c.value
            , t.id tag_id
            , t.value tag_name 
         FROM components c
         JOIN connect_tag_com ctc 
           ON ctc.component_id = c.id 
         JOIN tags t 
           ON t.id = ctc.tag_id 
        WHERE t.id IN(8,11,12)
     ) x
  JOIN ( SELECT @prev:=null,@i:=0 ) vars
 ORDER 
    BY value
     , FIELD(tag_id,8,11,12) ASC
     ) n
  WHERE i = 1  ORDER 
    BY FIELD(tag_id,8,11,12) ASC
     , value;

【讨论】:

以上是关于PHP,MySQL 选择,按字段排序并分组的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(或 PHP?)按字段数据分组结果

(MySQL)按字段分组并选择 COUNT(field) 和分组行数

mysql 按表达式或函数分组多个字段分组排序

MySQL:按字段/分组排序

请教各位大牛关于mysql按时间段分组查询的问题。

Jquery 或 PHP 按日期字段分组对象数组