【问题标题】:Select rows where one value in field name occured in multiple rows选择字段名称中的一个值出现在多行中的行
【发布时间】:2019-01-17 06:13:56
【问题描述】:

假设我有一个这样的数据库结构。

users

id    name    
1     Name1   
2     Name2   
3     Name3   
4     Name4   

还有一张桌子logs

id    userid
1     1
2     1      
3     2
4     3
5     3
6     3
7     4
8     4
9     4

现在,如果我在文本框中输入 3 并按提交,然后在服务器端 PHP 我需要使用 id 3 和 4 从 users 表中获取并显示记录,即 users 表中的 Name3 和 Name4 为在logs 表中,它们各出现了 3 次。同样,如果我按 2 并提交,它应该从 users 表中获取并显示记录 Name1 并显示为 users 1 在日志表中发生了 2 次。这里应该查询什么?我不明白如何开始,所以我无法发布我尝试过的内容。请帮忙。

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    试试这个查询,它正在工作

    select name from users where id in (select userid from logs  group by userid having count(userid) = '".$inputvalue."')
    

    DEMO LINK

    【讨论】:

    • 它将统计所有未分组用户的userid列。
    • 我最喜欢的答案。您从 users 表中选择名称并具有它所属的条件:在 WHERE 子句中。
    • @SayedMohdAli 您稍后对其进行了编辑并在子查询中添加了 group by ...现在显然没问题
    • 完全按照我的意愿工作。谢谢。
    【解决方案2】:

    按用户分组,只取那些具有您输入的记录数的组

    select u.name
    from users u
    join logs l on l.userid = u.id
    group by u.name
    having count(l.id) = $inputValue
    

    Demo

    【讨论】:

    • Group by 需要在“l.userid”上,显然,您必须更改选择列表。所以重建查询。
    • 不,它没有。
    • @Muhammad Waheed:如果 name 在 users 表中不是唯一的,那就太奇怪了。如果是这样,那么请求的查询结果将变得毫无意义,因为如果两个用户名称相同,我们将不知道它是哪一个。 (此外:即使我们按id 分组,我们仍然可以选择name,因为后者在功能上依赖于前者。)
    • @juergend 现在你明白了吗? Thorsten 你是对的
    • @Muhammad Waheed:嗯,...实际上,我所说的是支持 juergen d 的声明,而不是你的。
    【解决方案3】:

    这对你有用。

    Select u.name 
    from ( select userid,count(*) as NoOfRecords 
           from logs 
           group by userid 
           having count(*) = $inputvalue ) as a
    inner join users u on a.userid = u.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 2017-05-31
      • 2011-01-08
      • 2020-12-20
      • 2014-10-23
      • 2021-03-09
      相关资源
      最近更新 更多