2016-01-06 24 views
0

如何仅选择以特定topic_id('5000')开始/开始且包含多个topic_id的会话?伪代码中的WHERE子句中的代码。MySQL group_concat WHERE字段中的第一项具有特定ID

request_id session_id topic_id 
1   1   3000 
2   1   5000 
3   2   5000 
4   2   3000 
5   2   6000 
6   3   5000 

SELECT 
min(request_id), 
session_id, 
group_concat(topic_id order by request_id asc SEPARATOR ' ,') 
FROM requests 
WHERE (first(topic_id) = '5000' AND count(topic_id) > 1) 
group by session_id 
order by request_id asc 

result: 
request_id session_id topic_id 
3   2   5000, 3000, 6000 

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

+0

“开始”的话题是什么意思?我们如何看到会话不仅包含主题,而且还以它开头?在会话表中,我们会在每个会话中找到一条记录,那么我们在哪里可以找到相关主题? –

+0

我添加了一个表格的例子,所以我希望这能够澄清我的问题。 “从......开始”意味着只应选择以topic_id 5000开头的会话。 – LarsVegas

回答

0

你可以改变你的查询通过LIKE要像下面使用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; 
+0

这将返回topic_id'5000'是最小值的所有会话,无论字符串中的哪个位置5000具有该值。 – LarsVegas

0

,你可以这样做:

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) 
+0

这将返回错误代码1111'组功能无效使用'。如果我排除'count(topic_id)> 1',查询将起作用,但只会返回仅包含topic_id'5000'的会话。 – LarsVegas

+0

查询已更新,请尝试。 –

+0

谢谢!如果在括号后添加“as sub query”这样的子查询,你的子查询就可以工作。但是,如果我包含'count(topic_id)> 1它将返回错误代码1111. – LarsVegas

0

这是在MySQL有点困难,但不是太困难当我们一步一步来做:

  1. 得到每session_id的最小request_id(即请求w第i每个会话的第一个主题)
  2. ,但只考虑一个以上的专题会议(与具有)
  3. 得到记录与ID(为了看它的topic_id)
  4. 只保留记录,其中的话题5000(你现在开始话题5000届也有其他主题)
  5. 访问所有topic_ids每个这样找到的会话(子查询)

查询:

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子句。

+0

谢谢Thorsten,您的答案看起来很有希望。但是我不能将它转移到我的问题上,因为它实际上已经包含一个JOIN语句(我之前没有提到它,使问题不会过于复杂)。我更新了这个问题。 – LarsVegas

+0

@LarsVegas:查看我的更新。 Gouda Elalfy的方式是解决这个问题的最简单的方法。 –

+0

Thorsten,我用你的第二个建议,它完美的工作! @Gouda Elalfy:我更新了您的解决方案。请接受同行评审。否则我会接受Thorstens解决方案。谢谢你们的帮助! – LarsVegas