【问题标题】:MySQL - Select Info based on many tablesMySQL - 根据许多表选择信息
【发布时间】:2012-06-20 15:07:49
【问题描述】:

我需要做以下事情:

Select Usernames from table delivery where date>"2012-06-01 00:00:00" 然后获取 IP 来自 Customers 按 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;

【问题讨论】:

  • “它不起作用” 你能说得更具体些吗?您收到错误消息吗?确切的信息是什么?

标签: mysql select inner-join


【解决方案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

【讨论】:

  • @Darkeden:你试过我的查询吗?
  • [Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行的“GROUP BY d.Username”附近使用正确的语法
  • 错误 1064 仍然存在 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行的“GROUP BY d.Username”附近使用正确的语法
  • @Darkeden:如果你删除那部分会发生什么?查询执行了吗?
  • 我在 SELECT 之后添加了 DISTINCT 并且它正在工作。谢谢。
【解决方案2】:

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

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;

【讨论】:

    【解决方案3】:

    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
    

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

    【讨论】:

    • 选择用户名.... c.Username = d.Username; - 返回错误 [Err] 1052 - 字段列表中的“用户名”列不明确
    • 它仍然无法正常工作。 "select distinct Username from delivery as c INNER JOIN Customers as d USING (Username) on c.Username = d.Username where indate>"2012-06-01" order by IP asc;"
    • [Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 'on c.Username = d.Username where indate>"2012-06-01" order by IP asc;' 附近使用在第 3 行
    • @Darkeden:USING 子句代替 ON 子句。你不应该同时使用两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2021-12-20
    • 2018-12-24
    相关资源
    最近更新 更多