Mysql SQL:Group By&;有子查询问题的计数(*)

Mysql SQL:Group By&;有子查询问题的计数(*),mysql,sql,Mysql,Sql,假设数据库具有模式 卡车(车牌、制造商、型号、年份、里程、最大负载) 驾驶员(驾驶员id、姓名、年龄、地址、驾照) 行程(车牌、驾驶员id、日期、起点、目的地、里程、货物、成本) 编写一条SQL语句,列出前往纽约的次数比前往华盛顿的次数多的司机的姓名和司机id 我想用这样的话来表达 SELECT name, driver-id FROM DRIVER, TRIP, (SELECT name, driver-id FROM DRIVER, TRIP

假设数据库具有模式

  • 卡车(车牌、制造商、型号、年份、里程、最大负载)
  • 驾驶员(驾驶员id、姓名、年龄、地址、驾照)
  • 行程(车牌、驾驶员id、日期、起点、目的地、里程、货物、成本)
编写一条SQL语句,列出前往纽约的次数比前往华盛顿的次数多的司机的姓名和司机id

我想用这样的话来表达

SELECT 
    name, driver-id 
FROM 
    DRIVER, TRIP,
    (SELECT name, driver-id 
     FROM DRIVER, TRIP 
     WHERE TRIP.driver-id = DRIVER.driver-id AND destination = “Washington” 
     GROUP BY name, driver-id) as TEMP 
WHERE
    TRIP.driver-id = DRIVER.driver-id 
    AND destination = “New York” 
    AND DRIVER.driver-id = TEMP.driver-id
GROUP BY 
    name, driver-id 
HAVING 
    COUNT(*) > TEMP.COUNT(*);

这是正确的吗?谢谢

我想你只需要在这里按司机汇总,然后断言去纽约的次数超过了去华盛顿的次数:

SELECT
    d.name,
    d.driverid
FROM DRIVER d
INNER JOIN TRIP t
    ON d.driverid = t.driverid
GROUP BY
    d.name,
    d.driverid
HAVING
    SUM(t.destination = 'New York') >
    SUM(t.destination = 'Washington');

这种方法只是使用两个计数的条件聚合对连接的表进行单次传递。我通常不会使用您的方法,因为select子句中有一个很大的子查询。

我认为您只需要在这里按司机汇总,然后断言到纽约的行程数超过到华盛顿的行程数:

SELECT
    d.name,
    d.driverid
FROM DRIVER d
INNER JOIN TRIP t
    ON d.driverid = t.driverid
GROUP BY
    d.name,
    d.driverid
HAVING
    SUM(t.destination = 'New York') >
    SUM(t.destination = 'Washington');
这种方法只是使用两个计数的条件聚合对连接的表进行单次传递。我通常不会使用您的方法,因为select子句中有一个很大的子查询。

使用聚合
sum()
case
关键字

select * from (
    SELECT d.name, d.driver-id
        , sum(case when destination = 'Washington' then 1 else 0 end) as washington
        , sum(case when destination = 'New York' then 1 else 0 end) as newyork
    FROM DRIVER d
    INNER JOIN TRIP t ON t.driver-id = d.driver-id
    GROUP BY d.name, d.driver-id) t1 
where t1.newyork > t1.washington
使用聚合
sum()
case
关键字

select * from (
    SELECT d.name, d.driver-id
        , sum(case when destination = 'Washington' then 1 else 0 end) as washington
        , sum(case when destination = 'New York' then 1 else 0 end) as newyork
    FROM DRIVER d
    INNER JOIN TRIP t ON t.driver-id = d.driver-id
    GROUP BY d.name, d.driver-id) t1 
where t1.newyork > t1.washington

今天的提示:使用现代的显式
JOIN
语法。更容易写入(无错误)、更容易读取(和维护),并且在需要时更容易转换为外部联接“这正确吗?”-测试似乎很简单-有问题吗?正在运行吗?列名中是否真的允许使用“-”(换句话说:减号),而名称周围没有QOUTS?今天的提示:使用现代的显式
JOIN
语法。更容易写入(无错误)、更容易读取(和维护),并且在需要时更容易转换为外部联接“这正确吗?”-这似乎是一个简单的测试——有问题吗?正在运行吗?列名中是否真的允许使用“-”(换句话说:减号),而在名称周围没有qoutes?