2012-06-20 7 views
0

мне нужно сделать следующее:MySQL - выбор информации на основе нескольких таблиц

Выбрать Usernames из таблицы доставки где дата> «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; 

Не работает, любая идея?

EDIT:

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, для правильного синтаксиса для использования рядом с «GROUP BY d.Username» в строке 6 – Darkeden

+0

Ошибка 1064 неподвижных изображений - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «GROUP BY d.Username» по строке 6 – Darkeden

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.

+0

Решила, спасибо. – Darkeden

+0

Выберите Имя пользователя .... c.Username = d.Username; - возвращает ошибку [Err] 1052 - Столбец «Username» в списке полей неоднозначен – Darkeden

+0

он не работает. "выберите различное имя пользователя с доставкой как c INNER JOIN Клиенты как d ИСПОЛЬЗОВАНИЕ (Имя пользователя) на c.Username = d.Username где indate>" 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; 
Смежные вопросы