RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Примеры MySQL запросов для Joomla

Выбрать всех пользователей

SELECT * FROM jos_users

Показать все опубликованные статьи:

SELECT * FROM jos_content
WHERE state = '1' 

Показать всех пользователей кроме "admin"

SELECT * FROM jos_users
WHERE username <> 'admin'

В предыдущих выражениях знак звездочки (*) обозначает показывать все столбцы. Теперь если мы хотим показать только email пользователей, выражение будет выглядеть так:

SELECT name, email FROM jos_users

Показать заголовки только опубликованных разделов

SELECT title FROM jos_sections
WHERE published = 1

Примечание: Указывать (*) несомненно удобно, но на практике запросы начинают использовать больше оперативной памяти, и как следствие производительность начинает падать. Выбирайте только необходимые данные, это упростит вам жизнь в дальнейшем.


Сортировка данных в MySQL

Для того чтобы выводить данные в определенном порядке, а не в том как они лежат в базе данных, используем конструкцию "ORDER BY", например сортировка id по возрастанию

SELECT * FROM jos_content
WHERE state ='1'
ORDER BY id ASC

или по убыванию id

SELECT * FROM jos_content
WHERE state ='1'
ORDER BY id DESC

так же никто не мешает сделать несколько сортировок (в порядке убывания приоритета)

SELECT * FROM jos_categories
ORDER BY published ASC, section ASC, id DESC


Ограничение вывода

Выведем 10 строк из таблицы jos_content

SELECT * FROM jos_content
LIMIT 0, 10

Для того чтобы чтобы выбрать начиная с 5 записи следующие 20, пишем следующее

SELECT * FROM jos_content
LIMIT 5, 20


Логические операторы SQL

MySQL поддерживает логические операторы, например выберем все материалы, старше 20 сентября 2008 года:

SELECT * FROM jos_content
WHERE state = '1'
AND created < '2008-09-20 00:00:00'

Усложним выбор несколькими условиями, кол-во просмотров не более чем 2000 и не меньше 1000:

SELECT * FROM jos_content
WHERE state = '1'
AND hits > '1000'
AND hits < '2000'
AND created < '2008-09-20 00:00:00'

И по традиции можно использовать скобки, чтобы явно указать приоритет среди сравнений:

SELECT * FROM jos_content
WHERE (sectionid = '5' OR sectionid = '6')
AND created < '2009-08-20 00:00:00'
ORDER BY created DESC
LIMIT 0, 10


Работа с текстом в MySQL

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

SELECT username
FROM jos_users
WHERE username LIKE 'a%'

Или заканчиваются на "о"

SELECT id,email,usertype
FROM jos_users
WHERE username LIKE '%о' 


Функции MySQL

Кроме того есть набор встроенных в MySQL функций. Названия говорят сами за себя

SELECT AVG(hits) FROM jos_content
SELECT COUNT(*) FROM jos_content
SELECT MAX(hits) FROM jos_content
SELECT SUM(hits) FROM jos_content

К тому же эти функции можно использовать вместе с группировкой. Подсчитаем кол-во хитов для каждого из раздела, упорядочим по убыванию

SELECT sectionid, SUM(hits) AS hits.
FROM jos_content
GROUP BY sectionid
ORDER BY hits DESC


Вложенные запросы SQL

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

SELECT id, name
FROM jos_content
WHERE id NOT IN (SELECT content_id FROM jos_content_frontpage)


Объединения в MySQL

Применяются объединения когда нужно использовать данные более чем из одной таблицы. Выборка имени материала с категорией, таблицы объединены по соответствующим 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

Смотрите также:
Комментарии (12) Добавить комментарий
  • ArtIrinka
    ArtIrinka
    06 Февраля 2012, 18:18
     ↑  +3  ↓     ответ

    У меня при запросе SELECT * FROM #__yy

    выводится почему-то только первый id (хотя должны выводиться все значения таблицы)

    сама функция выглядит так:

    $db =& JFactory::getDBO();

    $query = 'SELECT * FROM #__yy';

    $db->setQuery( $query );

    $xx = $db->loadResult();

    return $xx;

    Может здесь нужно цикл добавить?

    • Aventurier
      Aventurier
      08 Марта 2012, 05:55
       ↑  +3  ↓     ответ

      Вам надо было в предпоследней строке вместо

      $xx = $db->loadResult();

      вывести

      $xx = $db->loadObjectList();

  • ArtIrinka
    ArtIrinka
    13 Марта 2012, 12:57
     ↑  0  ↓     ответ

    Спасибо большое

  • Максим
    Максим
    18 Июля 2012, 22:23
     ↑  0  ↓     ответ

    Огромное спасибо. Очень помогло в создании запросов.

    Остальные статьи тоже хороши лаконичностью и обилием примеров.

  • Андрей
    Андрей
    24 Октября 2012, 16:36
     ↑  0  ↓     ответ

    Здравствуйте

    подскажите, как составить запрос (в phpmyadmin),

    если я хочу очистить (заменить на 0) значение всех полей `hits` в таблице `jos_content`,

    то есть обнулить счетчик просмотров материалов

  • Nen
    Nen
    26 Декабря 2012, 00:58
     ↑  0  ↓     ответ

    Ничего из написанного не работает

  • IVan
    IVan
    06 Мая 2013, 00:45
     ↑  0  ↓     ответ

    С построение запросов нет проблем.

    НО! Но где их вводить в Joomla?

    Через PhpMyAdmin? - ну там это понятно, а в Joomla есть такая возможность?

    (На примере, как в NetCat)

    • Александр
      Александр
      20 Ноября 2013, 19:33
       ↑  -2  ↓     ответ

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

  • Alena
    Alena
    22 Февраля 2014, 05:15
     ↑  0  ↓     ответ

    Здравствуйте! Подскажите как выбрать материалы с одинаковым ALIAS? Благодарю!

  • usemind
    usemind
    01 Апреля 2014, 01:53
     ↑  0  ↓     ответ

    благодарю за столь понятные и полноценные объяснения!

  • ыв
    ыв
    06 Октября 2014, 16:21
     ↑  0  ↓     ответ

    Кака drop table сделать?

  • Александр
    Александр
    11 Декабря 2014, 21:14
     ↑  0  ↓     ответ

    Ругается на LIMIT и не работает цикл. Помогите поправить

    В цикле выводит или одну и туже картинку или просто "i"

    $q ="SELECT vm.`file_url_thumb`

    FROM `#__virtuemart_medias` vm

    LEFT JOIN `#__virtuemart_product_medias` vpm ON vpm.`virtuemart_media_id` = vm.`virtuemart_media_id`

    WHERE vpm.`virtuemart_product_id`='".$product->virtuemart_product_id."'

    LIMIT 0, 10

    AND vm.`file_mimetype` LIKE 'image/%'

    ORDER BY vm.`file_is_product_image` DESC ";

    $db->setQuery($q); //1. Установим этот запрос в экземпляр класса работы с базами данных

    $db->query(); //2. Выполним запрос

    echo ' '.$db->getAffectedRows ().''; //3. Посмотрим сколько было задействовано строк

    $thumburl = $db->loadResult();

    if(!$thumburl)

    $thumburl = 'components/com_virtuemart/assets/images/vmgeneral/'.VmConfig::get('no_image_set');

    echo '<div class="browsecellwidth">';

    echo $product->virtuemart_vendor_id;

    echo '<div class="compaign-name"><h6><a href="'.$product_url.'" >'.ucfirst($product->product_name).'</a></h6></div>';

    echo '<div class="holder-compaign-avatar"><div class="slider"><div class="slides">';

    $count_images = $db->getAffectedRows ();

    echo $count_images;

    if ($count_images = 10) {

    for ($i = 1; $i < 10; $i++)

    {

    $img = $thumburl[$i];

    echo '<div class="slide"><a href="'.$juri.$img.'" alt="'.ucfirst($product->product_name).'" data-lightbox="roadtrip['.ucfirst($product->product_name).']" tite="'.ucfirst($product->product_s_desc).'" data-title="'.ucfirst($product->product_s_desc).'"><img src="'.$juri.$img.'" class="compaign-avatar"></a></div>';

    }

    } else {

    for ($i = 0; $i < $count_images; $i++)

    {

    $img = $thumburl[$i];

    echo '<div class="slide"><a href="'.$juri.$img.'" alt="'.ucfirst($product->product_name).'" data-lightbox="roadtrip['.ucfirst($product->product_name).']" tite="'.ucfirst($product->product_s_desc).'" data-title="'.ucfirst($product->product_s_desc).'"><img src="'.$juri.$img.'" class="compaign-avatar"></a></div>';

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.