SQL для Вікіпроектів/Список сторінок: відмінності між версіями

Матеріал з Вікіпідручника
Вилучено вміст Додано вміст
Ilya (обговорення | внесок)
Antanana (обговорення | внесок)
м →‎Вибір колонок: милозвучність
Рядок 49: Рядок 49:
Чому так? Якщо не вказати явно порядок сортування, база даних чи інструмент для виконання запитів використовує певний порядок сортування за умовчанням.
Чому так? Якщо не вказати явно порядок сортування, база даних чи інструмент для виконання запитів використовує певний порядок сортування за умовчанням.


В нашому випадку сортування відбулося за тими колонками, які мі запитували — page_namespace і page_title.
У нашому випадку сортування відбулося за тими колонками, які мі запитували — page_namespace і page_title.


== Сортування ==
== Сортування ==

Версія за 15:39, 22 травня 2018

Всі колонки із таблиці

Виведемо всі колонки із таблиці сторінок page (Запит у Quarry)

 SELECT * FROM ukwikibooks_p.page

Запит повертає всі рядки та всі колонки із таблиці сторінок page. Декілька перших рядків виглядають так:

page_id page_namespace page_title page_restrictions page_counter page_is_redirect page_is_new page_random page_touched page_links_updated page_latest page_len page_no_title_convert page_content_model
1 0 Main_Page 0 1 0 0.425922502496 20130412175651 None 7988 45 0 wikitext
2 0 Головна_сторінка 0 0 0 0.429793028827 20161101043156 20161101043221 19411 1441 0 wikitext
931 10 Wikibrothers 0 0 0 0.085830608583 20140817194306 None 16493 1304 0 wikitext
938 3 195.39.196.2 0 0 0 0.207369529163 20050703143510 None 2057 571 0 wikitext
942 2 Ashapochka 0 0 1 0.301798192112 20130407223156 None 2061 128 0 wikitext
...

Вибір колонок

Виведемо із таблиці page лише колонки, які нас цікавлять: page_namespace і page_title (Запит у Quarry)

 SELECT 
   page_namespace, page_title 
 FROM 
   ukwikibooks_p.page

Несподівано ми отримали зовсім інші перші рядки:

page_namespace page_title
0 AutoIt
0 Be_able_to
0 Bison
... ...

Чому так? Якщо не вказати явно порядок сортування, база даних чи інструмент для виконання запитів використовує певний порядок сортування за умовчанням.

У нашому випадку сортування відбулося за тими колонками, які мі запитували — page_namespace і page_title.

Сортування

Ми можемо вказати сортування явно, додавши до запиту ORDER BY page_namespace, page_title, і отримати такий самий результат (Запит у Quarry)

 SELECT 
   page_namespace, page_title 
 FROM 
   ukwikibooks_p.page 
 ORDER BY 
   page_namespace, page_title

Тепер отримаємо такий же порядок сортування, як був у нас спочатку, коли ми отримували всі колонки. Для цього додамо сортування за колонкою page_id: ORDER BY page_id<> (Запит у Quarry)

 SELECT 
   page_id, page_namespace, page_title 
 FROM 
   ukwikibooks_p.page 
 ORDER BY 
   page_id

Тепер результат відсортовано за page_id і перші рядки виглядають так:

page_id page_namespace page_title
1 0 Main_Page
2 0 Головна_сторінка
931 10 Wikibrothers
938 3 195.39.196.2
942 2 Ashapochka
...

Простори назв

Отже, що означають цифри 0, 2, 3, 4, 10, 14 у колонці page_namespace? Це коди, які відповідають різним просторам імен. У довідці з просторів імен є табличка із номерами стандартних просторів імен:

Індекс

Назва

Обговорення
0 (Основний) Обговорення 1
2 Користувач Обговорення користувача 3
4 Вікіпідручник Обговорення Вікіпідручника 5
6 Файл Обговорення файлу 7
8 MediaWiki Обговорення MediaWiki 9
10 Шаблон Обговорення шаблону 11
12 Довідка Обговорення довідки 13
14 Категорія Обговорення категорії 15
-1 Спеціальна N/A
Медіа Media

У Вікірозмітці можна вивести префікс простору назв із допомогою магічного слова {{ns}}:

Простори імен для статей Простори імен для сторінок обговорення
Використання Результат Використання Результат
{{ns:-2}} / {{ns:Media}} Медіа {{ns:-1}} / {{ns:Special}} Спеціальна
(no talk page)
{{ns:0}} / {{ns:}} {{ns:1}} / {{ns:Talk}} Обговорення
{{ns:2}} / {{ns:User}} Користувач {{ns:3}} / {{ns:User talk}} Обговорення користувача
{{ns:4}} / {{ns:Project}} Вікіпідручник
Varies between wikis
{{ns:5}} / {{ns:Project talk}} Обговорення Вікіпідручника
{{ns:6}} / {{ns:File}} or {{ns:Image}} Файл {{ns:7}} / {{ns:File talk}} or {{ns:Image talk}} Обговорення файлу
{{ns:8}} / {{ns:MediaWiki}} MediaWiki {{ns:9}} / {{ns:MediaWiki talk}} Обговорення MediaWiki
{{ns:10}} / {{ns:Template}} Шаблон {{ns:11}} / {{ns:Template talk}} Обговорення шаблону
{{ns:12}} / {{ns:Help}} Довідка {{ns:13}} / {{ns:Help talk}} Обговорення довідки
{{ns:14}} / {{ns:Category}} Категорія {{ns:15}} / {{ns:Category talk}} Обговорення категорії

Список сторінок із вікіпосиланням

SQL Функція CONCAT об’єднує в один рядок значення своїх параметрів

Наприклад

 CONCAT('[[', page_title, ']]') 

поверне рядок який складається із двох квадратних дужок, які відкриваються, значення колонки page_title та дві квадратні дужки, які закриваються, що разом дасть вікірозмітку для посилання на сторінку з назвою page_title

Додамо умову, що вибираємо лише сторінки із основного простору (простору статей)

 WHERE page_namespace = 0 

і виведемо вікірозмітку посилання на статті (код у Quarry)

 SELECT 
   CONCAT('[[', page_title, ']]') AS page_link
 FROM 
   ukwikibooks_p.page 
 WHERE 
   page_namespace = 0

Результат:

page_link
AutoIt
Be_able_to
Bison
...

Список сторінок із посиланням, що включає префікс простору назв

Аналогічно ми можемо вивести список сторінок, що містить повне посилання на сторінку, яке включає і префікс простору назв (код у Quarry)

 SELECT 
   page_id, 
   page_namespace,
   page_title, 
   CONCAT(
     '[[:{{ns:', page_namespace, '}}:', page_title, ']]'
   ) AS page_link
 FROM 
   ukwikibooks_p.page 
 ORDER BY 
   page_id

Результат:

page_id page_namespace page_title page_link
1 0 Main_Page [[::Main_Page]]
2 0 Головна_сторінка [[::Головна_сторінка]]
931 10 Wikibrothers Шаблон:Wikibrothers
938 3 195.39.196.2 Обговорення користувача:195.39.196.2
942 2 Ashapochka Користувач:Ashapochka
972 3 Cl Обговорення користувача:Cl
991 2 Ilya Користувач:Ilya
1467 14 Головна Категорія:Головна
1495 2 Albedo Користувач:Albedo
1549 4 Портал_спільноти Вікіпідручник:Портал_спільноти
1557 2 Zigger Користувач:Zigger
1558 3 Zigger Обговорення користувача:Zigger
1578 3 Gangleri Обговорення користувача:Gangleri
1579 2 Gangleri Користувач:Gangleri
1659 14 Українська_мова Категорія:Українська_мова