MySQL - 根据许多表选择Info

时间:2012-06-20 15:07:49

标签: mysql select inner-join

我需要做以下事情:

发送

选择用户名,其中日期>“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;

3 个答案:

答案 0 :(得分: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表中没有重复项。

答案 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
相关问题