0

我需要执行以下操作:

从表交付中选择用户名,其中日期>“2012-06-01 00:00:00”,然后从客户订单中获取IP ,并删除重复的用户名(全部基于选择的第一个用户名)。

select Username from delivery where date>"2012-06-01 00:00:00"
                        INNER JOIN Customers d
                        ON c.Username = d.Username order by IP asc;

它不工作,任何想法?

编辑:

select Username from delivery c
    INNER JOIN Customers d
    ON c.Username = d.Username 
where date>"2012-06-01 00:00:00"
order by IP asc;
4

3 回答 3

1

1)WHERE子句必须在JOIN ... ON ...子句之后。

2)你引用一个表c

ON c.Username = d.Username 

但你还没有定义什么c是。

3) 您想删除重复的用户名,但您没有这样做。您需要SELECT DISTINCT UsernameGROUP BY Username

4) 要解决列名不明确的问题,您可以使用以下两种方法之一:

  • 在列名之前指定表别名(用点分隔)。
  • 用作USING连接条件,以避免Username两次获取列。

这是第二种方法的示例:

...
FROM delivery AS d
INNER JOIN Customers AS c USING (Username)
...

如您所见,它更加简洁,这意味着您可以Username在查询中的其他地方引用,而无需指定表别名来消除歧义。


解决问题的一种完全不同的方法是使用EXISTS而不是JOIN

SELECT DISTINCT
    Username, IP 
FROM customers
WHERE EXISTS
(
    SELECT *
    FROM delivery
    WHERE delivery.Username = customers.Username 
    AND delivery.date >= '2012-06-01'
)
ORDER BY IP

假设您的表DISTINCT中没有重复项,您也可以在使用此方法时删除。customers

于 2012-06-20T15:10:30.933 回答
1

您缺少第一个表上的别名:

select Username from delivery c 
INNER JOIN Customers d ON c.Username = d.Username
where c.date='2012-06-01 00:00:00'
order by IP asc;
于 2012-06-20T15:11:14.540 回答
1

试试这个:

SELECT DISTINCT d.Username, c.IP 
FROM delivery d INNER JOIN Customers c
    ON d.Username = c.Username 
   AND DATE(d.date) >= "2012-06-01"
ORDER BY c.IP
于 2012-06-20T15:11:22.637 回答