Блог о заработке, seo, joomla и не только...
Здравствуйте дорогие читатели блога. Сегодня мы рассмотрим примеры SQL запросов для Joomla которые используются часто.
Выбрать всех пользователей:
SELECT * FROM jos_users
Показать все неопубликованные статьи:
SELECT * FROM jos_content WHERE state = '0'
Показать всех пользователей кроме "admin":
SELECT * FROM jos_users WHERE username != 'admin'
В предыдущих выражениях знак звездочки (*) обозначает показывать все столбцы. Теперь если мы хотим показать только email пользователей, запрос будет выглядеть по другому:
SELECT name, email FROM jos_users
Показать заголовки только опубликованных разделов:
SELECT title FROM jos_sections WHERE published = 1
Указывать (*) очень удобно. На практике запросы в базу данных начинают использовать больше памяти в следствие чего производительность начнет падать. Выбирайте только нужные данные, это упростит вам жизнь.
Запросы ограничении вывода
Выведем 5 строк из таблицы jos_content кроме первой:
SELECT * FROM jos_content LIMIT 1, 5
Для того чтобы чтобы выбрать первые 15 строка, пишем следующее:
SELECT * FROM jos_contentLIMIT 0, 15
Работа с текстом в MySQL
Из всех пользователей найдем только тех, имя которых начинаются на "О":
SELECT username FROM jos_users WHERE username LIKE 'о%'
Из всех пользователей найдем только тех, имя которых заканчиваются на "с":
SELECT id,email FROM jos_users WHERE username LIKE '%с'
MySQL поддерживает логические операторы, например выберем все опубликованные материалы которые старше 29 марта 2012 года:
SELECT * FROM jos_content WHERE state = '1'AND created < '2012-03-29 00:00:00'
Усложним выбор несколькими дополнительными условиями, количество просмотров не более чем 3500 и не меньше 2012:
SELECT * FROM jos_content WHERE state = '1'AND hits > '2012' AND hits < '3500' AND created < '2012-03-29 00:00:00'
Можно использовать скобки, чтобы явно указать приоритет среди сравнений:
SELECT * FROM jos_content WHERE (sectionid = '6' OR sectionid = '7') AND created < '2012-03-29 00:00:00' ORDER BY created DESCLIMIT 0, 15
Для того чтобы выводить данные в определенном порядке используем конструкцию "ORDER BY", например сортировка id по убыванию:
SELECT * FROM jos_content WHERE state ='1' ORDER BY id DESC
Сортировка по возрастанию id:
SELECT * FROM jos_content WHERE state ='1' ORDER BY id ASC
Делаем несколько сортировок (в порядке убывания приоритета):
SELECT * FROM jos_categories ORDER BY published ASC, section ASC, id DESC
Допустим мы хотим использовать в своем запросе поле, которое определено в другой таблице. Например выберем все страницы, которые не выведены на главную:
SELECT id, name FROM jos_content WHERE id NOT IN (SELECT content_id FROM jos_content_frontpage)
Набор встроенных в MySQL функций. Названия говорят за себя:
SELECT AVG(hits) FROM jos_content
SELECT MAX(hits) FROM jos_content
SELECT COUNT(*) FROM jos_content
SELECT SUM(hits) FROM jos_content
Функции можно использовать вместе с группировкой. Подсчитаем количество хитов для каждого из раздела, упорядочим по возрастанию
SELECT sectionid, SUM(hits) AS hits. FROM jos_content GROUP BY sectionid ORDER BY hits ASC
Применяются объединения в MySQK когда нам нужно использовать данные более чем из одной таблицы. Выборка имени материала с категорией, таблицы объединены по соответствующим id. Чтобы избежать двусмысленности мы приписываем названия таблиц к имени поля через точку:
SELECT jos_categories.title, jos_content.title FROM jos_content JOIN jos_categories ON jos_content.catid = jos_categories.id ORDER BY jos_categories.id
Дополнительно используем таблицу с jos_users, чтобы узнать имя автора материала:
SELECT jos_categories.title, jos_content.title, jos_users.username FROM jos_content JOIN jos_categories ON jos_content.catid = jos_categories.id JOIN jos_users ON jos_content.created_by = jos_users.id ORDER BY jos_categories.id
Теперь используем все в одном примере:
SELECT jos_categories.title, jos_content.title, jos_users.username FROM jos_content JOIN jos_categories ON jos_content.catid = jos_categories.id JOIN jos_users ON jos_content.created_by = jos_users.id WHERE jos_content.state = '1' AND jos_content.hits > '10' AND jos_content.id NOT IN (SELECT content_id FROM jos_content_frontpage) ORDER BY jos_categories.id
Выше я описал чаще всех использующих запросов. Поделюсь любым запросом, пишите в комментариях.