SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 03.06.2010 03:07:47

test
Участник
Зарегистрирован: 03.06.2010
Сообщений: 7

Выбор первого найденного результата

Есть 2 связанные таблицы. Links и их Titles. Связаны между собой ключом `id` = `link_id`. Необходимо из titles выбирать первый подходящий результат в определённой последовательности кодов.

`links`
----------------------------------------
`id` | `url`                   | `active`
'1'    | 'http://localhost/'   | '1'
'2'    | 'http://another.url' | '1'
======================

`titles`
---------------------------------------
`link_id` | `title`        | `code`
'1'          | 'локалхост'  | '12'
'2'          | 'другой.урл' | '12'
'2'          | 'another.url' | '24'
'1'          | 'locallos'      | '6'
=====================

Суть ситуации такова:
Необходимо при нахождении title'а с `code` = 24 выбрать только его данные, и только в случае его отсутствия искать `code` = 6, а потом `code` = 12.
В итоге должно получиться только 2 элемента. `link_id` = 1 && `code` = 6 (так как не существует элемента с `code` = 24) и `link_id` = 2 && `code` = 24.
Оба `title` с кодом 12 не выбираются, так как существуют элементы с кодами 24 и 6.

Неудавшаяся попытка:

SELECT * FROM `links`, `titles` WHERE `id` = `link_id` AND `active` = '1' AND ( `code` = '24' OR `code` = '6' OR `code` = '12' );

Данный запрос выдал все 4 элемента `title` в последовательности кодов 24 -> 6 -> 12, а хотелось бы что бы при любом найденном в данной очерёдности коде выбирались данные текущего элемента, и поиск переходил к следующему `link_id`.

Отредактированно test (03.06.2010 12:15:20)

Неактивен

 

#2 03.06.2010 15:35:07

test
Участник
Зарегистрирован: 03.06.2010
Сообщений: 7

Re: Выбор первого найденного результата

Вопрос частично решён:

SELECT * FROM `links`, `titles` WHERE `active` = '1' AND `code` = ( SELECT `code` FROM `titles` WHERE `id` = `link_id` AND ( `code` = '24' OR `code` = '6' OR `code` = '12' ) ORDER BY FIELD ( `code`, '24', '6', '12' ) LIMIT 1 );


Хотелось бы услышать мнение профессионалов, корректно ли данное использование вложенного SELECT'а?

Отредактированно test (03.06.2010 15:51:44)

Неактивен

 

#3 04.06.2010 02:49:02

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

Re: Выбор первого найденного результата

Я бы сказал, что подзапрос лишний. Достаточно объединения таблиц + ORDER + LIMIT.

Неактивен

 

#4 06.06.2010 01:29:38

test
Участник
Зарегистрирован: 03.06.2010
Сообщений: 7

Re: Выбор первого найденного результата

Вытянута только часть столбцов для примера, обе таблицы значительно больше, и объединение их повлечёт только увеличение дублирующихся данных.

Неактивен

 

#5 06.06.2010 16:33:11

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

Re: Выбор первого найденного результата

То есть Вы считаете, что лишний подзапрос упростит конструкцию в целом?

Неактивен

 

#6 07.06.2010 01:46:24

test
Участник
Зарегистрирован: 03.06.2010
Сообщений: 7

Re: Выбор первого найденного результата

Если имели ввиду под "объединить таблицы" - слияние 2х таблиц в одну, то в таком случае конструкция будет куда проще, но тогда страдает место на жёстких дисках, причём значительно.
Если же вы имели ввиду JOIN'ы или UNION'ы, то буду благодарен за совет по оптимизации.

Неактивен

 

#7 07.06.2010 20:53:31

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

Re: Выбор первого найденного результата

Вы, наверное, что-то такое хотите?

SELECT * FROM links, titles
WHERE active = 1
AND ( `code` = '24' OR `code` = '6' OR `code` = '12' )
AND id = link_id
ORDER BY  FIELD ( `code`, '24', '6', '12' );

Неактивен

 

Board footer

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