【问题标题】:mySQL >> Adding HREF links to a Distinct GROUP_CONCATmySQL >> 将 HREF 链接添加到不同的 GROUP_CONCAT
【发布时间】:2018-03-19 11:47:48
【问题描述】:

我有以下查询:

SELECT *, RES.res_id 'ID', RES.RES_Title 'Title', 
GROUP_CONCAT(DISTINCT T.T_Name separator ', ') 'Topics', 
GROUP_CONCAT(DISTINCT CH.CH_Code separator ', ') 'Chapters' 
FROM Resources RES 
LEFT JOIN topic_to_resource RT ON RT.RT_ResourceID = RES.RES_ID 
LEFT JOIN topics T on T.T_ID = RT.RT_TopicID 
LEFT JOIN topic_to_chapter TCH on TCH.TCH_TopicID = T.T_ID 
LEFT JOIN chapters CH ON CH.CH_ID = TCH.TCH_FrameworkID 
WHERE RES_Status = 'Active' 
GROUP BY RES.RES_ID 
ORDER BY RES_Title ASC, RES_Source DESC LIMIT 0, 10

对于每个 GROUP_CONCAT(主题和章节),我需要将列表转换为链接,同时保持 Distinct。

例如,代替上述查询的主题输出:体育、时事、政治、气候等。

我需要生成:

<a href="page.asp?topic=Sports" title="Sports">Sports</a>, 
<a href="page.asp?topic=Current%20Events" title="Current Events">Current Events</a>, 
<a href="page.asp?topic=Politics" title="Politics">Politics</a>, 
<a href="page.asp?topic=Climate" title="Climate">Climate</a>

我可以通过在 GROUP_CONCAT 中嵌套一个 CONCAT 来实现链接,但是我失去了 Distinct。此外,我需要查询按资源 ID (RES.RES_ID) 分组。

关于如何完成不同主题和章节的链接列表的任何想法?

非常感谢!

【问题讨论】:

  • 嗨。同样,阅读minimal reproducible example 并采取行动非常重要。这包括 DDL 和示例输入数据和所需的输出。此外,我们不知道“在保持独特性的同时列出链接”是什么意思——如果一个人已经知道你想要什么,但没有传达它,那只是一堆模糊的描述性草率的词。向我们展示您的“已经”。代码与任何东西有什么关系?我只是重复你上一个问题的评论。请采取行动。是的,很难说清楚和准确。所以努力吧。 (我已经告诉你完成某些句子。这样做。)
  • Strange duplicate behavior from GROUP_CONCAT of two LEFT JOINs of GROUP_BYs 的可能重复项。阅读左连接的定义。它返回内部联接所做的以及由空值扩展的不匹配的左行。你想要一个左连接的内连接。
  • @philipxy,再次感谢。我刚刚添加了当前生成的内容和需要生成的内容的示例。我还将准备并分享一个 SQL Fiddle。
  • @philipxy,我不敢苟同,这是您引用的帖子的副本。我的问题是关于如何在嵌套在 GROUP_CONCAT 中的 CONCAT 中维护“不同”。
  • 请发布指向sqlfiddle.com 的链接以显示示例表。

标签: mysql distinct concat group-concat


【解决方案1】:

this question 开始,并使用该查询作为以下示例的基础,您可以通过以下方式执行此操作:

SELECT 
CONCAT(res_id,': ',res_name) 'Resources', 
GROUP_CONCAT(distinct t_name order by t_id separator ',') 'Topics', 
GROUP_CONCAT(distinct ch_name order by ch_id separator ',') 'Chapters'
FROM (SELECT res_id,
      res_name,
      t_id,
      t_name,
      ch_id, 
      CONCAT("<a href=\"page.asp?topic=",ch_name,"\" title=\"",ch_name,"\">",ch_name,"</a>") as ch_name 
             FROM resources r
             JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
             JOIN topics t on t.t_id = ttr.tr_tid
             JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
             JOIN chapters ch ON ch.ch_id = tch_chid) links
      GROUP BY res_id
      ORDER BY res_id, t_id, ch_id;

基本上,我已将源数据包装在一个单独的(子)查询中,构建链接,然后在此之外执行GROUP_CONCATs。

这会产生:

<a href="page.asp?topic=CHAPTER #1" title="CHAPTER #1">CHAPTER #1</a>,
<a href="page.asp?topic=CHAPTER #2" title="CHAPTER #2">CHAPTER #2</a>,
<a href="page.asp?topic=CHAPTER #3" title="CHAPTER #3">CHAPTER #3</a>

详情请见this fiddle

【讨论】:

  • 克里斯,非常感谢这个解决方案。我已经在我们的系统中实现了它,它完全按照我们需要的方式创建了记录集。唯一的问题是它很慢!我认识到这可能是一个索引问题。如果您要根据最大化查询速度来索引表,您会索引哪些字段?
  • 任何被“搜索”的字段都应该有一个索引——这也包括“加入”的字段。您的所有 id 字段是否都已编入索引?
  • 你的意思是WHERE中列出的任何字段以及连接中ON的两侧吗?
  • 基本上,是的。根据可用信息,它们都应该是单独的索引
  • 已完成索引...所有 ID 都已作为主键索引。我为搜索的所有其他内容(即在 WHERE 中)或用于 JOIN 的所有内容创建了索引。尽管如此,性能还是很慢。当我直接通过 phpMyAdmin 运行查询时,返回 63 条记录需要 43.37 秒。哪里是向您展示实际查询的好地方?
猜你喜欢
  • 2014-01-18
  • 2020-11-16
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多