Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация запроса 
:(
    Опции темы
Ninazu
Дата 31.7.2013, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 10.2.2013
Где: Киев

Репутация: нет
Всего: 1



Код

SELECT users.FirstName, users.LastName, states.state, cities.city
FROM users
INNER JOIN states
INNER JOIN cities ON users.city = cities.id
AND users.state = states.id
WHERE (
    FirstName LIKE  'M%'
    OR LastName LIKE  'M%'
    OR cities.city LIKE  'M%'
    OR states.state LIKE  'M%'
)
LIMIT 0 , 30


Подскажите как более красиво и правильно можно написать этот запрос? Требуемой логики добился, но кажется мне, что можно как-то красивей. (Суть запроса. подставить в таблицу users вместо id, значения из states и cities и отфильтровать по всем столбцам условие)

Для эксперимента пользуюсь этим
Код

CREATE TABLE IF NOT EXISTS `cities` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `city` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `city` (`city`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

INSERT INTO `cities` (`id`, `city`) VALUES
(1, 'Grand Rapids'),
(2, 'Covina'),
(3, 'Merizo'),
(4, 'Sierra Marde'),
(5, 'Princeton'),
(6, 'Durham'),
(7, 'Fairmont');

CREATE TABLE IF NOT EXISTS `states` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `state` (`state`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

INSERT INTO `states` (`id`, `state`) VALUES
(1, 'New Jersey'),
(2, 'South Caroline'),
(3, 'Michigan'),
(4, 'Georgia'),
(5, 'Rhode Island'),
(6, 'Arcansas'),
(7, 'Oklahoma');

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `FirstName` varchar(50) NOT NULL,
  `LastName` varchar(50) NOT NULL,
  `city` int(11) NOT NULL,
  `state` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

INSERT INTO `users` (`id`, `FirstName`, `LastName`, `city`, `state`) VALUES
(1, 'Clark', 'Reyes', 1, 1),
(2, 'Dacey', 'Young', 2, 2),
(3, 'Mannix ', 'Bolton', 3, 3),
(4, 'Maris', 'Decker', 4, 4),
(5, 'Portia', 'Burns', 5, 5),
(6, 'Shelby', 'English', 6, 6),
(7, 'Suki', 'King', 7, 7);



Это сообщение отредактировал(а) Ninazu - 31.7.2013, 20:26
PM MAIL   Вверх
Zloxa
Дата 1.8.2013, 12:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Ninazu @  31.7.2013,  21:23 Найти цитируемый пост)
 как более красиво 

Код

select users.firstname
      ,users.lastname
      ,states.state
      ,cities.city
 from users
 inner join states on users.state = states.id
 inner join cities on users.city = cities.id
 where (users.firstname like 'M%' 
        or users.lastname like 'M%' 
        or cities.city like 'M%' 
        or states.state like 'M%'
       ) 
 limit 0, 30

Такое оформление мне кажется куда более красивым.  smile Зело уж не любим мною капс. 

Цитата(Ninazu @  31.7.2013,  21:23 Найти цитируемый пост)
правильно

О том как "правильно" знаете только вы. Но, исходя из того, что вы скрываемой вами "требуемой логики" уже добились, вопрос звучит странно. smile

Это сообщение отредактировал(а) Zloxa - 1.8.2013, 12:41


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ninazu
Дата 1.8.2013, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 10.2.2013
Где: Киев

Репутация: нет
Всего: 1



Насчет правильности логики это я поспешил)) LIKE находил до джоинов, заменил на HAVING норм стало)
Больше интересовала чистота кода. А капсом я просто привык отделять операторы от параметров. Насчёт CamelCase в FirstName и LastName согласен, лучше без него.

Это сообщение отредактировал(а) Ninazu - 1.8.2013, 19:17
PM MAIL   Вверх
Zloxa
Дата 1.8.2013, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Ninazu, вы не поняли о чем я. Я больше о том, что внешний аспект это дело вкуса. А для того чтобы определить, что подозрения в том, что ваш запрос возвращает не то, что вы хотели запрашивать, нужно как минимум знать что же именно вы хотите вернуть и для каких целей. А уж если про оптимизацию говорить, так там вобще много всего знать надо, что осталось за рамками вашего пояснения. 

В общем - описывайте цель а не отдельный шаг.

Это сообщение отредактировал(а) Zloxa - 1.8.2013, 19:50


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ninazu
Дата 1.8.2013, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 10.2.2013
Где: Киев

Репутация: нет
Всего: 1



user - хранит имя и фамилию, а также ключи к таблицам cities and states 
cities - хранит названия городов
states - хранит названия штатов
Вывести таблицу с текстовой информацией в формате
Имя, Фамилия, Город, Штат




Это сообщение отредактировал(а) Ninazu - 1.8.2013, 20:11
PM MAIL   Вверх
Zloxa
Дата 1.8.2013, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Ninazu @  1.8.2013,  21:07 Найти цитируемый пост)
Вывести таблицу с текстовой информацией в формате

Для решения этой задачи ни where ни like ни уж тем более having не нужны


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ninazu
Дата 1.8.2013, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 10.2.2013
Где: Киев

Репутация: нет
Всего: 1



Для решения этой задачи ни where ни like ни уж тем более having не нужны 

Можно взглянуть на решение без них?
PM MAIL   Вверх
Zloxa
Дата 1.8.2013, 23:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Ninazu @  1.8.2013,  22:39 Найти цитируемый пост)
Можно взглянуть на решение без них? 

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

Добавлено через 1 минуту и 17 секунд
Впрочем, пофиг. На тему забиваю. Толку тут не будет. Вытягивать клещами "А что ты вобще хочешь сдеалть", уже достало

Добавлено через 9 минут и 24 секунды
Лана, предприму еще попытку и спрошу прямо
1) Что вас не устраивает в приведенном вам запросе
2) Почему условие отбора такое странное? Что общего у людей с фамилией на букву "М" и людей, проживающих в городе на букву "М", чтобы объединять их в один набор. Это дейсвтительно странно. Так же странно как попросить жену "купи мне носки, ну или же кефир"


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
igorold
Дата 8.8.2013, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



А почему так:
Код

INNER JOIN states
INNER JOIN cities ON users.city = cities.id
                   and users.state = states.id

?

Может так правильней будет:
Код

INNER JOIN states ON users.state = states.id
INNER JOIN cities ON users.city = cities.id

?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Zloxa
Дата 8.8.2013, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(igorold @  8.8.2013,  08:57 Найти цитируемый пост)
Может так правильней

эквивалентно же )) Немного не поансишному, конечно, но вполне себе на диалекте. У маси, я так понимаю, inner join без on кляузы являет суть cross join.
Так же как ты написал не правильнее, просто лишь красивее, читабельнее. Оптимизатор, если не запутается, должен бы привести к одному плану.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.