Выбор страниц по пути в базах данных MySQL / SQLite - PullRequest
2 голосов
/ 05 октября 2009

Я храню страницы для веб-сайтов в таблице базы данных «страницы», на них ссылается их путь (то есть «статьи / мой первый блог-пост»), мне нужно выбрать всех дочерних элементов определенной страницы но без выбора внуков.

Так что, если я бегу:

SELECT * FROM pages WHERE path LIKE 'articles%'

Я получу страницы со следующими путями:

articles/one
articles/two
articles/two/more
articles/three
articles/three/more/even-more

Мне нужно отфильтровать их (в запросе), чтобы просто:

articles/one
articles/two
articles/three

В любом случае можно сделать что-то вроде:

SELECT * FROM pages WHERE path LIKE 'articles%' AND path NOT LIKE 'articles%/%'

Есть идеи? Приветствия.

Ответы [ 4 ]

2 голосов
/ 05 октября 2009

Вы можете использовать регулярные выражения для этого. Ключевое слово REGEXP работает как для mysql , так и для sqlite :

... WHERE path REGEXP '^articles/[^/]+'
2 голосов
/ 05 октября 2009

Если ваши файлы имеют расширения, это будет работать:

   SELECT * FROM pages 
    WHERE path LIKE 'articles%' 
      AND SUBSTRING_INDEX(path,'/',2) LIKE '%.file_extension';

в противном случае:

   SELECT * FROM pages 
    WHERE path LIKE 'articles%' 
      AND SUBSTRING_INDEX(path,'/',2)=SUBSTRING_INDEX(path,'/',3)=;
1 голос
/ 05 октября 2009

Использование регулярных выражений (предложение LIKE или REGEXP) может вызвать серьезные проблемы с производительностью в SQLite, поскольку они требуют полного сканирования таблиц. Подробнее об этом читайте в http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html.

Вы можете использовать операторы неравенства (например, <и>) для увеличения производительности (если у соответствующего столбца есть индекс).

0 голосов
/ 05 октября 2009
SELECT * FROM pages WHERE path LIKE "%/%" AND path NOT LIKE "%/%/%"; 

у меня работает как минимум.

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