Выборка, если уж ничего не осталось

  • Автор темы striimii
  • Дата начала

striimii

Guest
Выборка, если уж ничего не осталось

Задача, выбрать из базы запись соответствующую заданному name и id, если такого id нет, то выбрать с id = 0.

Запрос: SELECT * FROM table WHERE name = 'abc' AND (id = '1' OR id = '0')

Данная конструкция будет работать ТОЛЬКО, если в базе запись с id 0 будет ПОСЛЕ id 1. В противном случае будет всегда выбираться с id 0.

Есть ли возможно найти решение в пределах одного запроса? Как сделать за два, я знаю.
 

Frol

Новичок
идея поставить скобки в другом месте не приходила в голову?
 

Frol

Новичок
Paxan
молодец.
развивай дальше армию "copy-paste'шиков".
 

striimii

Guest
Frol: не шуми, в форум ходят за помощью, а не для того чтобы их обосрали :)

Paxan: твой вариант не сработает, так как если не найдется пара name + id, то выберется ЛЮБАЯ запись с id = 0. Если же сделать WHERE (name AND id = 1) OR (name AND id = 0), то это вообщем-то равноценно моему варианту, что тоже не подходит. P.S. id не уникальное поле, уникальным является пара name/id
 

Frol

Новичок
Panchous
ошибаешься.

Paxan
есть.

striimii
давай сюда реальные данные, а не выдуманные.
а то так мы сможем годать еще долго.
 

striimii

Guest
Хорошо. Есть таблица в которой хранятся данные которые различаются по имени (name) и принадлежности к домену (id).

Ближе к реальному примеру:

name, id, data
----------------------------
"config", 0, <data>
"config", 1, <data>

Теперь если запросить data для имени config и домену 1, то выберется вторая запись, а если запросить данные для имени config и домену 2, то поскольку их нету, должны вернуться данные для домена 0 (они общие "shared" записи).

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

Paxan

Новичёк
Задача, выбрать из базы запись соответствующую заданному name и id, если такого id нет, то выбрать с id = 0.
вой вариант не сработает, так как если не найдется пара name + id, то выберется ЛЮБАЯ запись с id = 0.
Ты сам разберись вначале, что тебе надо.
 

striimii

Guest
Где именно разбираться? Я же написал, что твой вариант выберет ЛЮБУЮ запись, а не с нужным name.

А мне надо чтобы выбралась name/id, если такого нет, то name/id=0.
 

Frol

Новичок
striimii
я не вижу запроса.

-~{}~ 05.03.05 21:09:

о.
я просек фишку. :)
отсортируй id по уменьшению.
 

striimii

Guest
Забей.

Больше времени уходит на выяснение с вами отношений, чем на реальную помощь.

Спасибо.
 

GeT

Новичок
striimii
Насчет вашего самого первого вопроса.
Данная конструкция будет работать ТОЛЬКО, если в базе запись с id 0 будет ПОСЛЕ id 1. В противном случае будет всегда выбираться с id 0.
Вы не правы. Если такой индекс существует, то будут выбираться ОБЕ записи. А уж в каком порядке они будут выбираться - дело ваше.

P.S. может, я неправильно понял вопрос.
 

striimii

Guest
GeT, спасибо. Но я решил сделать за два запроса, так как это работает гарантировано, а также не используются сложные конструкции, которые могут не работать на какой-нибудь из поддерживаемых баз. Да и вряд ли существует решение "в одном запросе". Cильно сэкономить на времени выполнения вряд ли удалось бы.

Тем не менее, всем спасибо.
 

GeT

Новичок
striimii
По-моему, решение "в одном запросе" существует. И оно написано в вашем первом посте.
Что касается "поддерживаемых баз", что это за база где нет выборки по нескольким параметрам?
И еще, когда у вас в таблице будет 100.000 записей, вы поймете что один запрос в этом случае СИЛЬНО экономит время выполнения =)
 

alexhemp

Новичок
А что тут сложного не пойму.

Выберите запись с нужным id и name + запись с id=0, отсортируйте по id desc и LIMIT 1

т.е.
SELECT ... FROM table t, ... WHERE (t.ID=1 AND t.NAME='...') OR t.ID=0 ORDER BY t.ID DESC LIMIT 1

-~{}~ 06.03.05 17:41:

GeT
Насчет 100000 записей. Когда у вас столько будет - то поймете что правильное проектирование структуры БД значительно важнее КОЛИЧЕСТВА запросов. Иными словами на порядки важнее КАЧЕСТВО проектирования.

Запросы тоже в общем-то оптимальные писать тоже нужно уметь. И есть масса случаев, когда два запроса будут работать быстрее чем один, но более комплексный.
 
Сверху