SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.04.2009 19:07:03

nws
Участник
Зарегистрирован: 19.08.2008
Сообщений: 6

Перестройка запроса

Всем привет!

Есть запрос:


SELECT DISTINCT
                part_number,
                default_part_number
            FROM
                item_part_relationship
            WHERE
                item_id = 0000  
                    AND part_number <> 'aaaa'
            ORDER BY
                default_part_number DESC
 


Он прогоняется большое кол-во раз и каждый раз меняется item_id, part_number

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

SELECT *
FROM Store_Information
WHERE store_name IN ('Los Angeles', 'San Diego')
 


Но проблема в том, что default_part_number или item_id может и не быть и IN их тогда проглотит.

Помогите перестроить запрос так чтобы он вызывался 1 раз с большим кол-ом элементов(item_id, part_number).

Неактивен

 

#2 10.04.2009 22:25:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Перестройка запроса

Брр, ничего не понял. Особенно про «проглотит». Если Вам нужно в одном запросе вывести несколько
строк, соответствующих разным item_id, то можно просто объединить их через OR:

WHERE (item_id=1 AND part_number <> 'a') OR (item_id=2 AND part_number <> 'b')


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

Неактивен

 

#3 10.04.2009 23:32:59

nws
Участник
Зарегистрирован: 19.08.2008
Сообщений: 6

Re: Перестройка запроса

paulus написал:

Брр, ничего не понял. Особенно про «проглотит».

Т.е. если запрос будет таким:


SELECT *
FROM table
WHERE some_field IN ('qqq', 'www','eee',' ')
 


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

qqq
www
eee

Отредактированно nws (10.04.2009 23:34:34)

Неактивен

 

#4 11.04.2009 00:58:07

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Перестройка запроса

1. Вы специально приводите код каждый раз с разными именами полей? Чтобы поменьше понятно было? smile
2. Кто вам сказал, что отстутствие пустой строки в таблице приведет к тому, что результата вообще не будет?

IN - Это выбор из набора, т.е. последний ваш запрос аналогичен такому:


SELECT *
FROM TABLE
WHERE
  some_field = 'qqq'
OR
  some_field = 'www'
OR
  some_field = 'eee'
OR
  some_field = ' '

Разумеется, если в таблице есть qqq,www,eee - то они будут в результате

Отредактированно Shopen (11.04.2009 01:00:29)

Неактивен

 

#5 11.04.2009 01:04:24

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Перестройка запроса

paulus написал:

WHERE (item_id=1 AND part_number <> 'a') OR (item_id=2 AND part_number <> 'b')


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

Почему? Если есть составной индекс (item_id,part_number) - должен вроде работать нормально, если конечно item_id относительно уникален

Неактивен

 

#6 11.04.2009 04:42:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Перестройка запроса

Да, наверное, будет. Это я после рабочего дня писал тяжелого, голова соображала плохо.
Решил, что INDEX_MERGE пойдет, а тут действительно AND между операндами, а не OR.
Внутри скобок, я имею в виду smile

Неактивен

 

#7 11.04.2009 21:53:44

nws
Участник
Зарегистрирован: 19.08.2008
Сообщений: 6

Re: Перестройка запроса

Всем спасибо, по идеи должно работать нормально, в понедельник проверю smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson