我需要做以下事情:
表发送选择用户名,其中日期>“2012-06-01 00:00:00”然后获取 IP 来自客户按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;
答案 0 :(得分:1)
1)WHERE
子句必须在JOIN ... ON ...
子句之后。
2)您引用了一个表c
:
ON c.Username = d.Username
但您尚未定义c
是什么。
3)您想要删除重复的用户名,但您没有这样做。您需要SELECT DISTINCT Username
或GROUP 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
表中没有重复项。
答案 1 :(得分: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;
答案 2 :(得分: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