SQLite-запрос для поиска определенной последовательности элементов, хранимых индивидуально в таблицах - PullRequest
2 голосов
/ 09 января 2012

Допустим, у меня есть база данных товаров SQLite, чтобы ехать в поезде. Моя база данных организована так:

Merchandise table
Merchandise ID
Name (some other info)

Train table
Train ID
(some other info)

Loading table
Train ID
Merchandise ID
Car number (0 for the locomotive and going down from there).

Какой будет правильный запрос, если я хочу найти конкретную последовательность автомобилей. Допустим, я знаю, в каких поездах две машины игрушек следуют друг за другом, а затем одна машина помидоров, а затем одна машина грязи.

(Мое приложение на самом деле не так, но это упрощает аналогию того, что мне действительно нужно ...)

РЕДАКТИРОВАТЬ ... после некоторой царапины на голове ...

Вот что у меня есть:

SELECT * FROM
 (SELECT * FROM merchandise JOIN loading ON merchandise.merchandise_id=loading.merchandise_id WHERE name="toys") AS car1
  JOIN (SELECT * FROM merchandise JOIN loading ON merchandise.merchandise_id=loading.merchandise_id WHERE name="toys") AS car2
    ON (car2.position=car1.position+1) AND car1.train_id=car2.train_id
  JOIN (SELECT * FROM merchandise JOIN loading ON merchandise.merchandise_id=loading.merchandise_id WHERE name="tomatoes") AS car3
    ON (car3.position=car2.position+1) AND car2.train_id=car3.train_id
  JOIN (SELECT * FROM merchandise JOIN loading ON merchandise.merchandise_id=loading.merchandise_id WHERE name="dirt") AS car4
    ON (car4.position=car3.position+1) AND car3.train_id=car4.train_id

Мне нужно сделать немного больше тестов, но, похоже, все в порядке.

Не уверен, есть ли более эффективный способ, хотя (нужно взглянуть на детали 'EXPLAIN QUERY PLAN')

1 Ответ

0 голосов
/ 09 января 2012

Я не совсем уверен, есть ли хороший способ сделать это, полностью из sql.Однако вот одному удалось заставить его работать.При этом у меня есть несколько предостережений, о которых я упомяну после запроса:

select
    sub.train_id
from
    (   -- We need a sub-query here to we can sort
        -- *before* the group by (and group_concat)
        select
            l.train_id,
            m.name
        from
            loading l
            join merchandise m
                on l.merchandise_id = m.id
        order by
            l.car_no
    ) as sub
group by
    sub.train_id
having
    -- If you want no other items, you'll want to remove the '%s's
    -- Also, you could use ids instead of names to make this a little more robust
    group_concat(sub.name) like '%toys,toys,tomatoes,dirt%'

Хорошо, вот что не так с этим:

  • group_concat, вероятно, будет работать толькодля последовательностей до определенной длины.Я не использовал это много в sqlite, но mysql имеет (или имел некоторое время назад) ограничение примерно в 256 символов.Я не уверен в каких-либо ограничениях, которые имеет sqlite, но об этом следует помнить.
  • , пока это работает, и порядок, похоже, сохраняется в group_concat (sqlite версии 3.7.7.1),Документы прямо заявляют: « Порядок составных элементов произвольный »

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

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