Как написать сложные операторы Sqlite SELECT? - PullRequest
1 голос
/ 10 июля 2011

Итак, позвольте мне привести пример.Вот как выглядит таблица:

+----+------+------+------+
| id | body | date | type |
+----+------+------+------+
| 1  | foo  | 1101 | typ1 |
| 4  | baz  | 1110 | typ1 |
| 3  | bar  | 1115 | typ2 |
| 3  | goo  | 1114 | typ1 |
| 2  | fee  | 1111 | typ2 |
+----+------+------+------+

Поэтому мне нужно подготовить инструкцию SELECT, которая возвращает что-то вроде этого:

+----+------+------+------+
| id | body | date | type |
+----+------+------+------+
| 1  | foo  | 1101 | typ1 |
| 3  | goo  | 1114 | typ1 |
| 3  | bar  | 1115 | typ2 | <- this is here because date is greater than 1114
| 4  | baz  | 1110 | typ1 |
| 2  | fee  | 1111 | typ2 | <- this is here because date is greater than 1110
+----+------+------+------+

Что такое логика сортировки и что я должен сохранитьв виду?

  • id столбец действительно не является идентификатором.Как вы можете видеть, 3 повторяется, и разница в type.
  • typ1 должна быть отсортирована по возрастанию идентификатора (в этом случае date не имеет значения).
  • typ2 необходимо объединить в отсортированный type1 по date (время unix).
  • Предложение передается уже созданному методу (предположим, это object.query ("SELECT ... и т. Д.). ")).Так что я не могу делать это в несколько этапов.

У вас есть идеи?Помимо базовых вещей, таких как SELECT ... ORDER BY id ASC, я не смог придумать, как это обойти.

Редактировать

Вот как была построена отсортированная таблица:

  1. Вы должны упорядочить typ1 по ID:

.

+----+------+------+------+
| id | body | date | type |
+----+------+------+------+
| 1  | foo  | 1101 | typ1 |
| 3  | goo  | 1114 | typ1 |
| 4  | baz  | 1110 | typ1 |
+----+------+------+------+

Затем мы должны упорядочить typ2 по дате, с учетом следующих ограничений:

  • typ2 должно отображаться ниже старшего typ1 date, которое не больше typ2 date.

Ответы [ 2 ]

0 голосов
/ 10 июля 2011

Мне кажется, я понимаю, для чего ты идешь. Можете ли вы попробовать это и дайте мне знать, если он это делает?

SELECT
    CASE 
        WHEN type='typ1' THEN id 
        WHEN type='typ2' THEN (
            SELECT T1.id
            FROM TheTable AS T1 
            WHERE T1.date=(SELECT MAX(T2.date)
                           FROM TheTable AS T2
                           WHERE T2.type='typ1' AND T2.date<TheTable.date)
                AND T1.type='typ1')
    END AS order_by_value,
    id, body, date, type
FROM TheTable
ORDER BY order_by_value, type, date;

Это будет проблематично, если есть записи 'typ2' с датами, меньшими, чем наименьшая дата 'typ1'; в противном случае он должен работать нормально.

Если вы не хотите, чтобы столбец «order_by_value» в вашем наборе результатов, отмените выбор из предыдущего запроса SQL следующим образом:

SELECT id, body, date, type 
FROM (
SELECT
    CASE 
        WHEN type='typ1' THEN id 
        WHEN type='typ2' THEN (
            SELECT T1.id
            FROM TheTable AS T1 
            WHERE T1.date=(SELECT MAX(T2.date)
                           FROM TheTable AS T2
                           WHERE T2.type='typ1' AND T2.date<TheTable.date)
                AND T1.type='typ1')
    END AS order_by_value,
    id, body, date, type
FROM TheTable
ORDER BY order_by_value, type, date);
0 голосов
/ 10 июля 2011

SELECT x.id,x.date, y.body,y.type from table as x left outer join table as y on (x.id=y.id) where x.date >1101 or x.date>1114


Полагаю, вы хотите красные значения ??я прав

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