MySQL group_concat字段中的第一个项目具有特定ID

时间:2016-01-06 14:01:43

标签: mysql where-clause group-concat

如何只选择以特定topic_id(' 5000')开头/开头且包含多个topic_id的会话?伪代码中的WHERE子句中的代码。

Stack,Overflow

我知道这应该适用于子查询,但我不知道如何。谢谢!!

3 个答案:

答案 0 :(得分:0)

您可以使用像{/ p>这样的HAVING子句将查询更改为如下所示

SELECT
request_id,
session_id,
group_concat(topic_id order by request_id)
FROM sessions 
GROUP BY session_id
HAVING MIN(topic_id) = '5000' 
AND COUNT(DISTINCT topic_id) > 1
ORDER BY request_id;

答案 1 :(得分:0)

您可以LIKE执行此操作:

select * from (
SELECT
    request_id,
    session_id,
    group_concat(topic_id order by request_id asc SEPARATOR ' ,') as groups
    ,  count(topic_id) as count_topic
    FROM sessions   
    group by session_id
    order by request_id asc
    ) as temp_table
    WHERE (topic_id LIKE '5000%' AND count_topic > 1)

答案 2 :(得分:0)

这在MySQL中有点困难,但是当我们一步一步地执行它时并不太难:

  1. 获取每个session_id的最小request_id(即每个会话具有第一个主题的请求)
  2. 但仅考虑具有多个主题的会话(使用HAVING)
  3. 获取具有该ID的记录(以查看其topic_id)
  4. 仅保留主题为5000的记录(您现在的会话以主题5000开头,但也有其他主题)
  5. 访问每个找到的会话的所有topic_ids(在子查询中)
  6. 查询:

    select
      request_id,
      session_id,
      (
        select group_concat(topic_id order by request_id asc separator ' ,')
        from requests topics
        where topics.session_id = requests.session_id
      )
    from requests
    where (session_id, request_id) in
    (
      select
        session_id,
        min(request_id)
      from requests
      group by session_id
      having count(distinct topic_id) > 1
    )
    and topic_id = 5000;
    

    (我冒昧地调用表requests,因为它似乎是表中包含的请求记录,每个引用可能有一个单独的sessions表的会话。)

    编辑:正如@Gouda Elalfy在他的回答中所表明的那样,仅通过查看连接的主题字符串就可以轻松完成。他应该更新他的答案,使查询看起来如下,然后你可以接受他的答案: - )

    select
      min(request_id),
      session_id,
      group_concat(topic_id order by request_id asc separator ' ,') as topics
    from requests
    group by session_id
    having topics like '5000 ,%';
    

    如果可以有像'5000,5000'这样的会话(即一个会话有多个请求,但只有一个主题),那么你必须将and count(distinct topic_id) > 1)添加到HAVING子句中。