2015-09-10 3 views
0

Я пытаюсь изучить mysql, но кажется, что без особого успеха. Я понимаю, как это работает, и я могу выполнить некоторые простые операции с такими данными, как вставка, обновление или выбор. Я могу делать простые выборки из одной таблицы или выбирать из разных таблиц с помощью объединений, как в примерах, которые я читал до сих пор. Я прочитал много учебников и статей, и я действительно все понимаю, но когда я сталкиваюсь с новым упражнением, я действительно не знаю, что делать и как начать с него.mysql как сделать трудные выборы

Для примера скажем, что я есть следующие таблицы в базе данных:

CREATE TABLE courses (`currency` varchar, `date` date, `course` decimal); 

INSERT INTO courses (currency, date, decimal) values ('USD', now(), 5.4); 
INSERT INTO courses (currency, date, decimal) values ('EUR', now(), 6.3); 
INSERT INTO courses (currency, date, decimal) values ('USD', now(), 5.7); 
INSERT INTO courses (currency, date, decimal) values ('EUR', now(), 6.7); 

И мне нужно, чтобы получить последние курсы по каждой группе. Я даже не знаю, как начать с этого примера. Вначале выбраны все элементы по группам:

SELECT * FROM courses GROUP BY currency; 

Но я получаю только первые строки из каждой группы. Так что я немного искал Google, и я узнал, что люди используют JOIN. Но насколько я знаю, JOINS используются, когда вам нужно получать данные из нескольких реальных таблиц, почему я должен использовать соединения здесь?

Любые советы были бы очень оценены.

PS Это не домашнее задание, я действительно хочу, чтобы понять это

+1

Таблицы SQL представляют собой * неупорядоченные * наборы. Нет такой вещи, как первая или последняя строка. Если вы хотите пойти по порядку вставки, включите столбец 'auto_increment'. –

+0

ok Что делать, если мне нужны курсы по последней дате – user3673623

+0

СООБЩЕНИЯ, которые вы имеете в виду, вероятно, присоединяются к подзапросу в той же таблице, чтобы найти первые значения идентификатора (для каждой группы), эффективно используя JOIN в качестве фильтра результатов. – Uueerdo

ответ

1

group by для aggreating различных строк, так, например, если вы хотите, чтобы усреднить валюту course по каждой записи, вы можете сделать:

select currency,avg(course) from courses group by currency 

с другой стороны, если вы хотите валюты, сгруппированных рядом друг с другом, вы бы использовать order by вид:

select * from courses order by currency 

И потом, если вы хотите дальнейший заказ по времени ввода (так как у вас есть время вставки, как часть вашей таблицы), вы можете также добавить, что в список сортировки в качестве второго порядка вида:

select * from courses order by currency, date desc 
1

Вы бы используйте инструкцию JOIN с подзапросом, который захватывает максимальную (самую последнюю) дату.

SELECT a.* 
FROM courses a 
JOIN 
(
SELECT 
currency, max(date) as maxdate 
FROM courses 
GROUP BY currency 
) b on a.date=b.maxdate and a.currency=b.currency 
+0

Подзапросы в MySQL очень дороги, вызывая O (n^2), поскольку подзапрос выполняется один раз для каждой строки в основном запросе и может также приводить к игнорированию индексов. По возможности избегайте подзапросов в MySQL. – PaulProgrammer

Смежные вопросы