【问题标题】:Alternatives to GROUP BY/HAVING using MySQL使用 MySQL 的 GROUP BY/HAVING 的替代方案
【发布时间】:2015-11-20 07:05:38
【问题描述】:

我面临以下问题:

提出一个查询,列出拥有多于一辆车的人(pname)(您不能使用 GROUP BY 和/或 HAVING)

使用以下数据库架构:

车辆(车牌*、年份、品牌、型号、成本、名称)

这是我想使用的查询

select pname from vehicle
group by pname
having count(*) > 1;

我一直在尝试按照规范提出一种方法来做到这一点,但我没有取得任何成功。有人可以指导我这样做的逻辑吗?

感谢您的阅读。

【问题讨论】:

  • 不使用Groupby和Having的具体原因是什么? “你不能使用 GROUP BY 和/或 HAVING”
  • 将 pname 指定为 PK 是否存在缺陷?
  • 这只是练习题的一部分。我认为原因只是为了练习
  • 无论如何,一个简单的连接就足够了
  • @Strawberry 我也这么认为,因为可能有多个同名的人,但它只是一个练习题,所以我不考虑太多

标签: mysql sql sqlfiddle


【解决方案1】:
select * from 
    (select *, 
        if (@name= pname, 1,0) as flag,
        @name:= pname as pn
     from vehicle
     order by pname) sub
where sub.flag=1;

SQL fiddle

当汽车超过 2 辆时,我们还可以添加 DISTINCT 来覆盖案例

更新:

Select *
from vehicle v1
     join vehicle v2 on v1.pname=v2.pname 
                        and (v1.id!=v2.id)

您可以添加主键检查 PK of v1 !=PK of v2 来代替 v1.id!=v2.id

【讨论】:

  • 我明白了……我们以前用过这种别名方法,我不知道我怎么没看到。也许我只是使这些查询过​​于复杂。谢谢@StanislavL
【解决方案2】:

您尝试过使用Subquery 吗?

以你的表格作为参考,应该是这样的

SELECT 
p.pname
FROM person AS p
WHERE
(SELECT count(*) FROM vehicle where pname = p.pname) > 1

【讨论】:

  • 我认为这与问题的精神相悖。另外,由于这是作业,提供完整答案似乎有点不雅。
  • 我只是试图满足关于不使用 HAVING 和/或 GROUP BY 条件的问题要求。无论如何,您可以使用 DISTINCT 和 JOIN 获得相同的结果..
  • @Strawberry 我很抱歉,但我并不是在寻找一个直接的答案。我正在寻找这方面的建议或指导。谢谢
  • @Sektrax 你找到了
  • @Moch。 Rasyid 作为答案提供的查询显示了人员表中的所有名称,而我只有两个拥有不止一辆车的人。我不确定我是否理解为什么 where 子句中的条件会以它的方式检查计数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多