2015-02-04 2 views
0

я построить упражнения веб-приложение, и я работаю с двумя столами, как это:Выберите последнюю MAX() и MIN() - WebSQL

Таблица 1: weekly_stats

| id | code  |  type   |  date |  time | 
|----|--------------|--------------------|------------|----------| 
| 1 |   CC |     1 | 2015-02-04 | 19:15:00 | 
| 2 |   CC |     2 | 2015-01-28 | 19:15:00 | 
| 3 |   CPC |     1 | 2015-01-26 | 19:15:00 | 
| 4 |   CPC |     1 | 2015-01-25 | 19:15:00 | 
| 5 |   CP |     1 | 2015-01-24 | 19:15:00 | 
| 6 |   CC |     1 | 2015-01-23 | 19:15:00 | 
| .. |   ... |    ... | ...  | ... | 

Таблица 2: global_stats

| id | exercise_number |correct | wrong | 
|----|-----------------|--------|-----------| 
| 1 |    138 |  1 |   0 | 
| 2 |    246 |  1 |   0 | 
| 3 |    988 |  1 |  10 | 
| 4 |    13 |  5 |   0 | 
| 5 |    5 |  4 |   7 | 
| 6 |    5 |  4 |   7 | 
| .. |    ... | ... |  ... | 

что я хотел бы, чтобы получить MAX (правильно-неправильно) и MIN (правильно-неправильно), и теперь я работаю с этим запросом:

SELECT 
    exercise_number, 
    date, 
    time 
FROM weekly_stats AS w JOIN global_stats AS g 
ON w.id=g.id 
WHERE correct - wrong = (SELECT MAX(correct - wrong) from global_stats) 
UNION 
SELECT 
    exercise_number, 
    date, 
    time 
FROM weekly_stats AS w JOIN global_stats AS g 
ON w.id=g.id 
WHERE correct - wrong = (SELECT MIN(correct - wrong) from global_stats); 

Этот запрос работает хорошо, за исключением одного: когда «WHERE correct - wrong = (SELECT MIN (правильный - неправильный) [...]» выбирает более одной строки, выбранная строка является первой, но я хотел бы вернуть самые последние (другими словами: упорядочен по дате (дата, время)). Возможно ли это?

Спасибо!

+0

Непонятно, что вы спрашиваете, но если это всего лишь вопрос упорядочения результатов, то, возможно, добавление 'ORDER BY date DESC, time DESC' к каждому из компонентных запросов даст вам то, что вы хотите. –

ответ

1

Я думаю, вы можете решить, как это:

SELECT * FROM (
    SELECT 
     1 as sort_column, 
     exercise_number, 
     date, 
     time 
    FROM weekly_stats AS w JOIN global_stats AS g 
    ON w.id=g.id 
    WHERE correct - wrong = (SELECT MAX(correct - wrong) from global_stats) 
    ORDER BY date DESC, time DESC 
    LIMIT 1) as a 
UNION 
SELECT * FROM (
    SELECT 
     2 as sort_column, 
     exercise_number, 
     date, 
     time 
    FROM weekly_stats AS w JOIN global_stats AS g 
    ON w.id=g.id 
    WHERE correct - wrong = (SELECT MIN(correct - wrong) from global_stats) 
    ORDER BY date DESC, time DESC 
LIMIT 1) as b 
ORDER BY sort_column; 

Вот documentation о том, как работает UNION.

+0

Я не могу добавить 'ORDER BY' перед' UNION', я ошибаюсь? – elledienne

+0

Вы правы, я обновил ответ. Можете ли вы попробовать это? –

+0

Теперь он работает, но также вызывает новую проблему: теперь также возвращаются 2 строки по дате ... теперь, как я могу понять, какой из них является результатом MAX(), а другой - результатом MIN()? – elledienne