MYSQL-从多行、同一用户、不同值中选择

MYSQL-从多行、同一用户、不同值中选择,mysql,Mysql,下面是我的“适者生存”表。我需要根据学生id找出哪些学生参加了前一列中指定的前测和后测。因此,根据下面的简单表格,我需要返回studid 123456。如何为此编写SELECT查询 SQL query: SELECT studid, prepost FROM `fittest` LIMIT 0, 30 ; studid prepost 123456 pre 123456 post 1031460 pre 选择。。。。其中studid位于12345612

下面是我的“适者生存”表。我需要根据学生id找出哪些学生参加了前一列中指定的前测和后测。因此,根据下面的简单表格,我需要返回studid 123456。如何为此编写SELECT查询

SQL query: SELECT studid, prepost FROM `fittest` LIMIT 0, 30 ; 

    studid  prepost
    123456  pre
    123456  post
    1031460 pre

选择。。。。其中studid位于123456123457,…

尝试:

    select f1.studid
       from fittest f1
       inner join fittest f2
         on f1.studid = f2.studid
    where f1.prepost = 'pre' and f2.prepost = 'post'
这是试一试

SELECT studid
  FROM fittest
 GROUP BY studid
HAVING COUNT(DISTINCT prepost) = 2
或者,如果您想确保只有一行带有pre和一行带有post的id,那么您可以这样强制执行它

SELECT studid
  FROM fittest
 GROUP BY studid
HAVING (MAX(prepost = 'pre' ) + 
        MAX(prepost = 'post')) = 2
   AND COUNT(DISTINCT prepost) = 2
输出:

| STUDID | ---------- | 123456 |
这是两个查询的演示

根据实际主键,您可以使用以下选项:

SELECT studid
FROM fittest
WHERE prepost = 'pre' OR prepost = 'post'
GROUP BY studid
HAVING COUNT(DISTINCT prepost) = 2

如果此列中只能使用PRE和POST,请尝试

SELECT studid FROM fittest group by studid
HAVING Min(prepost)<>max(prepost)
有额外记录。

您可以使用JOIN

加入怎么样:

select s1.studid, s1.prepost, s2.prepost
from fittest s1
inner join fittest s2
    on s1.studid = s2.studid
where s1.prepost = 'pre' 
  and s2.prepost = 'post'

到目前为止你都试了些什么?向我们展示您的查询并让我们知道您面临的问题。'based on studid'选择studid,prepost FROM fittest where studid in 123456123457,'我需要根据studid查找哪些学生studid'有什么您不懂的?然后阅读整个问题:。。。参加了前后测试。这不会给你任何帮助output@downvoter:错误的查询并不意味着否决投票。。。请不要认为这会有任何输出。。。其中prepost='pre'和prepost='post'每次都会失败,因为这是不可能的…@peterm:我同意这是一个非常错误的查询,我想说反对你的查询。。。谢谢你帮我学了一些我不知道的东西。但我现在修改了我的答案,我同意你的看法。彼得姆的回答似乎更有说服力。我留下我的答案是为了提供信息,但它肯定不是最好的。@Luv:OP只有pre和post选项。@Luv我相信OP在现实生活中只有pre和post值。但是我添加了一个查询,它消除了使用pre和post以外的值的行的可能性。谢谢peterm和所有做出贡献的人!!这些建议得到了极大的赞赏。我用了你的第一个例子彼得。prepost的唯一选项是pre或post。
SELECT 
studid 
FROM `fittest` 
where prepost = 'pre' 
or prepost = 'post'
group by studid
having count(distinct prepost)=2
SELECT a.studid 
FROM fittest a 
JOIN fittest b 
    ON a.studid=b.studid 
        and a.prepost like 'pre' 
        and b.prepost like 'post'
select s1.studid, s1.prepost, s2.prepost
from fittest s1
inner join fittest s2
    on s1.studid = s2.studid
where s1.prepost = 'pre' 
  and s2.prepost = 'post'