0

私は次のことをする必要があります:

date> "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;
4

3 に答える 3

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 に答える
1

1)WHERE句は句の後に来る必要がありますJOIN ... ON ...

2)テーブルを参照しますc

ON c.Username = d.Username 

しかし、あなたは何であるかを定義していませんc

3) 重複したユーザー名を削除したいのですが、そうしていません。SELECT DISTINCT Usernameまたはする必要がありますGROUP BY Username

4) あいまいな列名の問題を解決するには、次の 2 つの方法のいずれかを使用できます。

  • 列名の前にテーブル エイリアスを指定します (ドットで区切ります)。
  • USING結合条件として使用して、Username列を 2 回取得しないようにします。

2 番目のアプローチの例を次に示します。

...
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 に答える