Примеры работы в MySQL
Приветствую вас, уважаемые коллеги! В этом посте рассматриваются некоторые вопросы MySQL, на которые мне пришлось отвечать при работе с разными проектами для сайтов, написанных на PHP. Как вы знаете работа с MySQL тесно связана с работой на языке программирования PHP, поэтому в конце статьи я хочу порекомендовать вам бесплатный материал на эту тему. А сейчас перейдем к нашим вопросам.
Содержание
- Каким запросом в MySQL можно вывести несколько максимальных значений?
- Что означает ошибка Too many connections?
- Как сделать доступ к MySQL Денвера из локальной сети?
- Как удалить из таблицы записи, у которых дата меньше текущей на десять дней?
- Как использовать запросы с командой модификации UPDATE MySQL?
- Как, используя объединение запроса UNION MySQL, выводить данные из главной и подчинённой таблицы в одну?
- Как в MySQL запросе сравнить дату из базы данных с текущей?
Каким запросом в MySQL можно вывести несколько максимальных значений?
Пример запроса:
SELECT field1 FROM Table ORDER BY field1 DESC LIMIT 5
или если одно значение
SELECT MAX(field) FROM Table
Что означает ошибка Too many connections?
Если возникла ошибка Too many connections, когда Вы пытались открыть страницу Вашего сайта, то это означает, что все соединения к Вашему MySQL серверу заняты другими пользователями.
Как решить эту проблему? За количество одновременных подключений отвечает переменная max_connections задано по умолчанию 100 подключений. Может у Вашего хостера слишком жесткое ограничение на количество одновременных подключений к MySQL, свяжитесь с ним и расскажите о проблеме.
Если это локальный сервер Denwer:
- Найдём конфигурационный файл mysql ( у меня находиться здесь: C:joomlaserverusrlocalmysql5my.cnf ).
- В подраздел [mysqld] добавляем строчку max_connections = 300. Чем больше число, тем лучше, но зависит от Вашего компьютера, может не выдержать.
- Сохраняем файл и перегружаем MySQL сервер.
Как сделать доступ к MySQL Денвера из локальной сети?
С помощью команды ipconfig в командной строке Windows определите локальный IP-адрес Вашего компьютера.
Настроем Брандмауэр Windows XP:
- Откройте Пуск — Панель управления, выберите Брандмауэр Windows.
- Перейдите на вкладку Исключения.
- Нажмите кнопку Добавить порт, в поле Имя введите ваш IP-адрес (у меня 192.168.1.33), а в поле Номер порта укажите 80.
для Windows 7:
- Откройте Пуск — Панель управления — Система и безопасность, выберите Брандмауэр Windows.
- В левой панели выберите Дополнительные параметры.
- В левой панели выберите Правила для входящих подключений.
- В правой панели выберите Создать правило…
- Тип правила — выберите Для порта. Далее.
- В поле Определенные локальные: укажите 80. Далее.
- Выберите Разрешить подключение. Далее.
- Выберите Частный профиль. Далее.
- Напишите имя профиля. Готово.
для Windows Vista:
- Откройте Пуск — Панель управления — Безопасность, выберите Брандмауэр Windows.
- Щелкните Разрешить доступ через брандмауэр Windows. Кнопка Продолжить.
- На вкладке «Исключения» нажмите кнопку Добавить порт.
- В поле «Имя» введите наименование (TCP по порту 80). В поле «Порт» введите 80.
- Убедитесь, что выбран параметр TCP. Кнопка Изменение области.
- Выберите Только локальная сеть (подсеть). ОК.
У меня хост хранится в директории C:joomlaserver/home/localhost/www. Чтобы назначить ему IP-адрес 192.168.1.33, я создал файл C:joomlaserver/home/localhost/.htaccess и добавил в него строки:
## Файл C:joomlaserverhomelocalhost.htaccess ## Укажите здесь ваш внешний IP-адрес, а не 192.168.1.33! # dnwr_ip 192.168.1.33
Перезапустите Денвер. Проверьте, что по адресу http://192.168.1.33
открывается ваш сайт /home/localhost/www. Вместо 192.168.1.33, Ваш IP-адрес.
Теперь Вы сможете работать с MySQL Денвера с другого компьютера, указав нужный IP-адрес.
Например, подключиться к phpMyAdmin по адресу:
http://192.168.1.33/phpMyAdmin/.
Как удалить из таблицы записи, у которых дата меньше текущей на десять дней?
Предположим, что у нас есть таблица «users», в которой поле «join_date» типа «дата». Воспользуемся встроенной функциями «TO_DAYS» и «NOW», чтобы выполнить поставленную задачу:
DELETE FROM `users` WHERE (TO_DAYS( NOW( ) ) - TO_DAYS( `join_date` )) > 10
Как использовать запросы с командой модификации UPDATE MySQL?
Например, у нас имеется главная таблица со статьями (articles) и ей подчинена по «id» другая, подчинённая ей таблица (faq). В подчиненной таблице (faq) есть поле «post», в котором содержится «id» из главной таблицы (articles). У той и у другой таблицы имеется поле «date», у главной таблицы (articles) в строках поле «date» заполнено, а подчиненной таблице это поле добавили позднее, поэтому оно пустое.
articles | faq | |||||
id | date | title | post | date | title | |
1 | 2012-09-15 | мускуль апдейт | 1 | 0000-00-00 | мускуль апдейт | |
2 | 2012-04-11 | сервер Денвер | 2 | 0000-00-00 | сервер Денвер | |
3 | 2012-03-05 | Too many connections | 4 | 0000-00-00 | Too many connections | |
4 | 2012-03-05 | TO_DAYS | 1 | 0000-00-00 | UPDATE MySQL |
Задача в том, чтобы заполнить все строки в поле «date» подчиненной таблицы (faq) в зависимости от того, какой записи из главной таблицы (articles) принадлежат строки в подчинённой таблице (faq). Воспользуемся для этого двумя запросами с командой модификации UPDATE MySQL:
UPDATE faq JOIN articles ON faq.post = articles.id SET faq.date = articles.date
ИЛИ
UPDATE faq, articles SET faq.date = articles.date WHERE faq.post = articles.id
Итак, с помощью запроса с командой модификации UPDATE MySQL, в подчинённой таблице (faq) были обновлены строки с полем «date» по «id».
articles | faq | |||||
id | date | title | post | date | title | |
1 | 2012-09-15 | мускуль апдейт | 1 | 2012-09-15 | мускуль апдейт | |
2 | 2012-04-11 | сервер Денвер | 2 | 2012-04-11 | сервер Денвер | |
3 | 2012-03-05 | Too many connections | 4 | 2012-03-05 | Too many connections | |
4 | 2012-03-05 | TO_DAYS | 1 | 2012-09-15 | UPDATE MySQL |
Например, если в главной таблице (articles) была строка с id = 1 и date = ‘2012-09-15’, а в подчинённой таблице (faq) две строки подченены записи главной таблицы (articles), то есть в поле «post» этих строк стоит значение 1. Значит после выполнения запроса с командой модификации UPDATE MySQL эти строки в поле «date» будут заполнены значением «2012-09-15».
Как, используя объединение запроса UNION MySQL, выводить данные из главной и подчинённой таблицы в одну?
Итак, существует две таблицы главная таблица (articles) и подчинённая ей по «id», таблица (faq):
articles | faq | ||||||
id | date | title | id | post | date | title | |
1 | 2012-09-15 | UNION MySQL | 1 | 1 | 2012-09-17 | юнион мускуль | |
2 | 2012-04-11 | Server Denwer | 2 | 2 | 2012-05-13 | сервер Денвер | |
3 | 2012-03-05 | TO_DAYS | 3 | 4 | 2012-03-25 | Ту мэни конэкшионс | |
4 | 2012-03-10 | Too many connections | 4 | 1 | 2012-09-28 | юнион мускуль |
При появлении новой строки в главной таблице, заноситься дата её добавления. В подчинённой таблице дата может отличаться, так как записи в неё добавляются позднее, по мере появления новых заметок. Главная запись из главной таблицы, как бы описывает категорию заметок, входящих в неё. Нужно из двух таблиц получить одну таблицу, используя объединение запроса UNION MySQL.
SELECT a.id, a.title, b.date AS mdate, b.title, b.id AS faq_id FROM DATA a, faq b WHERE a.id = b.post UNION SELECT a.id, a.title, a.date AS mdate, 'null', 0 FROM DATA a
В результате использования объединения запроса UNION MySQL, получим следующую таблицу:
articles | ||||
id | title | mdate | title | faq_id |
1 | UNION MySQL | 2012-09-17 | юнион мускуль | 1 |
1 | UNION MySQL | 2012-09-28 | юнион мускуль | 4 |
2 | Server Denwer | 2012-05-13 | сервер Денвер | 2 |
4 | Too many connections | 2012-03-25 | Ту мэни конэкшионс | 3 |
1 | UNION MySQL | 2012-09-15 | null | 0 |
2 | Server Denwer | 2012-04-11 | null | 0 |
3 | TO_DAYS | 2012-03-05 | null | 0 |
4 | Too many connections | 2012-03-10 | null | 0 |
Теперь можно использовать эту таблицу по своему усмотрению.
Как в MySQL запросе сравнить дату из базы данных с текущей?
Предположим, у вас есть таблица users и вам необходимо получить сведения о том, кому из пользователей были отправлены сообщения на текущую дату.
SELECT * FROM `users` WHERE DATE_FORMAT(`last_mail`, '%Y-%c-%d') = CURDATE()
Заметьте, что в первый параметр функции DATE_FORMAT записано поле last_mail из таблицы users. Второй параметр указывает на формат, который используется функцией DATE_FORMAT, чтобы форматировать значения из поля last_mail. Например, такой запрос:
SELECT DATE_FORMAT(`last_mail`, '%Y-%c-%d') FROM `users`
Он выведет примерно такие значения:
2014-1-30 2012-6-11 2013-3-30
Здравствуйте! У меня вопрос. Как с помощью запроса MySQL сделать так, чтобы данные из главной и подчинённой таблицы выводились в одну? Заранее спасибо за ответ.
Здравствуйте,Никита! Для этого нужно воспользоваться объединением запроса с помощью предложения UNION mysql. Пожалуйста. Постараюсь выделить время и разместить ответ здесь в этой статье.
Никита, ответ на Ваш вопрос добавлен!
Спасибо большое!