MySQL: динамически добавлять столбцы к результатам запроса - PullRequest
1 голос
/ 30 декабря 2011

У меня есть эта таблица:

update_id | project_id | content | date
------------------------------------------------------
1         | 1          | text... | 2011-12-20 22:10:30 
2         | 2          | text... | 2011-12-20 22:10:30 
3         | 2          | text... | 2011-12-21 22:10:30 
4         | 2          | text... | 2011-12-22 22:10:30 
5         | 2          | text... | 2011-12-23 22:10:30 

Чтобы получить последние два обновления для конкретного проекта, который я использую:

SELECT update_id, title, content, date
FROM updates
WHERE project_id = 2
ORDER BY date DESC
LIMIT 2

Теперь я хочу динамически добавить столбец «update_time» к результатам со значениями «LATEST» или «PREVIOUS», исходя из того, является ли это последним обновлением или предыдущим, как это:

update_time | update_id | content | date
------------------------------------------------------
LATEST      | 5          | text... | 2011-12-23 22:10:30 
PREVIOUS    | 4          | text... | 2011-12-22 22:10:30 

Только если вы хотите узнать, зачем мне это нужно: MySQL: выбрать строку по идентификатору с предыдущими и следующими строками по дате

Ответы [ 3 ]

6 голосов
/ 30 декабря 2011

Вот немного умного SQL. Он выбирает «ПОСЛЕДНИЙ» для первого ряда и «ПРЕДЫДУЩИЙ» для всех остальных (если у нас их более одного).

SELECT IF(@rownum = 0, 'LATEST', 'PREVIOUS') update_time, update_id, 
       title, content, date, (@rownum := @rownum + 1) r
FROM updates, (SELECT @rownum := 0) dummy
WHERE project_id = 2
ORDER BY date DESC
LIMIT 2

Также он добавляет еще один столбец в набор результатов. Надеюсь, это не проблема.

1 голос
/ 30 декабря 2011
SELECT 'LATEST' AS update_time
     , update_id, title, content, `date`
FROM updates
WHERE project_id = 2 
ORDER BY `date` DESC
LIMIT 1 OFFSET 0

UNION 

SELECT 'PREVIOUS'
     , update_id, title, content, `date`
FROM updates
WHERE project_id = 2 
ORDER BY `date` DESC
LIMIT 1 OFFSET 1

Неправильно использовать зарезервированные слова, такие как DATE, для имен столбцов или таблиц. MySQL позволяет вам использовать его, но другие СУБД не могут (или MySQL с другими настройками).

1 голос
/ 30 декабря 2011

Ну, @Sergei - это правильно, но если вы настаиваете, есть много способов сделать это. Вот быстрый

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

Обратите внимание, что мой mysql ржавый, так что вам, возможно, придется узнать, как это сделать.

Declare @Latest Date?
Declare @Previous Date?

Select @Latest = Select Max(`Date`) Where Product_ID = 2
Select @Previous = Select Max(`Date`) Where Product_ID = 2 and `Date` < @Latest

SELECT 'Latest' as Update_time,update_id, title, content, date
FROM updates
WHERE project_id = 2 and `Date` = @Latest
Union
SELECT 'Previous' update_id, title, content, date
FROM updates
WHERE project_id = 2 and `Date` = @Previous

Беспорядок за то, что вы могли бы сделать на стороне клиента в считанные секунды ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...