2012-06-20 15 views
0

我需要做到以下几点:MySQL的 - 选择信息基于很多表

选择用户名从表交付其中日期>“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

试试这个:

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 
+0

@Darkeden:你试过我的查询吗? – Marco

+0

[Err] 1064 - 你的SQL语法有错误;检查对应于你的MySQL服务器版本的第6行 – Darkeden

+0

的错误1064张剧照使用近“GROUP BY d.Username”正确的语法手册 - 你有一个错误的SQL语法;检查对应于你的MySQL服务器版本的第6行 – Darkeden

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表中。

+0

解决,谢谢。 – Darkeden

+0

选择用户名.... c.Username = d.Username; - 返回错误[Err] 1052 - 字段列表中的列'用户名'不明确 – Darkeden

+0

它仍然不起作用。 “选择从递送不同用户名为c INNER JOIN的顾客作为d上c.Username = d.Username USING(用户名),其中铟酸>” 2012-06-01" 为了通过IP ASC;” – Darkeden

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;