Вернуться   Форум SAPE.RU > Общие вопросы > Разработка и сопровождение сайтов

-->
Ответ
 
Опции темы
Старый 14.05.2011, 10:31   #1
Мафиози
 
Аватар для Русская мафия
 
Регистрация: 11.09.2008
Адрес: <H1></H1>
Сообщений: 1,174
Вес репутации: 258
Русская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущее
По умолчанию Помогите составить запрос

Всем привет!

Есть таблица:

id - znak

4 - 1
4 - 5
3 - 1
4 - 4
2 - 8

Как мне выбрать id, znak которого имеет значения 1 && 5 && 4. Т.е. мне должно выдать 4.


Без переборов на php можно обойтись? Чисто запросами к MySQL получится?

Чёт не допру...
__________________
Как дела?
Русская мафия вне форума   Ответить с цитированием
Старый 14.05.2011, 11:11   #2
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 264
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию

Русская мафия,
Самый простой вариант - это джоинами соединить таблицу саму с собой несколько раз по числу искомых параметров) и отфильтровать типа:
t1.id = t2.id and t2.id = t3.id and t1.znak = 1 and t2.znak = 4 and t3.znak = 5

Но если число параметров большое, то джоины не подойдут.

Добавлено через 5 минут
Также можно попробовать сделать группировку по id составить запрос.

Последний раз редактировалось boric; 14.05.2011 в 11:11. Причина: Добавлено сообщение
boric вне форума   Ответить с цитированием
Старый 14.05.2011, 11:42   #3
Мафиози
 
Аватар для Русская мафия
 
Регистрация: 11.09.2008
Адрес: <H1></H1>
Сообщений: 1,174
Вес репутации: 258
Русская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущее
По умолчанию

Цитата:
Сообщение от boric Посмотреть сообщение
Но если число параметров большое, то джоины не подойдут.
Что вы имеете ввиду под параметрами? Не понял...

Количество строк с одинаковым id и разными znak может сотни достигать, а то и больше...

Добавлено через 19 минут
Цитата:
Сообщение от boric Посмотреть сообщение
Также можно попробовать сделать группировку по id составить запрос.
Ну а как? Я думал про группировку, но ведь не получится так. Как составить можно это?

Добавлено через 7 минут
Придумал!

Можно что то типа этого:

PHP код:
SELECT id,COUNT(idfrom my_table WHERE znak IN (1,5,4GROUP BY id;
....

while ....
{
 if(
$count==3) echo 'WIN! - '.$id;
 } 
Будет работать?
Базы пока нет чтобы проверить - пока только проектирую всё в голове, как делать...
__________________
Как дела?

Последний раз редактировалось Русская мафия; 14.05.2011 в 11:45. Причина: Добавлено сообщение
Русская мафия вне форума   Ответить с цитированием
Старый 14.05.2011, 13:11   #4
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 264
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию

Цитата:
Сообщение от Русская мафия Посмотреть сообщение
Придумал!

Можно что то типа этого:

PHP код:
SELECT id,COUNT(idfrom my_table WHERE znak IN (1,5,4GROUP BY id;
....

while ....
{
 if(
$count==3) echo 'WIN! - '.$id;
 } 
Будет работать?
Базы пока нет чтобы проверить - пока только проектирую всё в голове, как делать...
Пхп не нужен.
PHP код:
SELECT id,COUNT(id) as c from my_table WHERE znak IN (1,5,4GROUP BY id HAVING c 3
У меня в поисковой системе (с обратным индексо, морфологией и пр.) подобный запрос успешно используется. Только на таблице в 30 миллионов записей начинает тормозить - за 5-10 сек отрабатывает. Но в новых версиях mysql большие таблицы можно на части разбивать.
boric вне форума   Ответить с цитированием
Старый 14.05.2011, 14:22   #5
Мафиози
 
Аватар для Русская мафия
 
Регистрация: 11.09.2008
Адрес: <H1></H1>
Сообщений: 1,174
Вес репутации: 258
Русская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущее
По умолчанию

boric,понятно, спасибо
__________________
Как дела?
Русская мафия вне форума   Ответить с цитированием
Старый 14.05.2011, 14:35   #6
Починяю примуса
 
Аватар для Atomic
 
Регистрация: 26.09.2008
Сообщений: 1,505
Вес репутации: 300
Atomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущее
По умолчанию

Цитата:
Что вы имеете ввиду под параметрами? Не понял...
Это называется SELF JOIN. При большом кол-ве соединений можно получить непредсказуемые результаты.
Цитата:
Как мне выбрать id, znak которого имеет значения 1 && 5 && 4. Т.е. мне должно выдать 4.
Не ясно что нужно. Все id имеющие znak 1,5 или 4? 4 результата выдаст в вашем примере.

Цитата:
-- Структура таблицы `test`
--

CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL auto_increment,
`pid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

--
-- Дамп данных таблицы `test`
--

INSERT INTO `test` (`id`, `pid`) VALUES
(1, 3),
(2, 4),
(3, 2),
(4, 5),
(5, 5),
(6, 4);
Запрос SELECT * FROM `test` WHERE pid IN (4,5)
выдаст
Цитата:
id pid
2 4
4 5
5 5
6 4
__________________
Починяю разнокалиберные примуса здесь.
Atomic вне форума   Ответить с цитированием
Старый 14.05.2011, 15:51   #7
Мафиози
 
Аватар для Русская мафия
 
Регистрация: 11.09.2008
Адрес: <H1></H1>
Сообщений: 1,174
Вес репутации: 258
Русская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущее
По умолчанию

Atomic,

в общем эта таблица - список свойств предметов.

id - это id предмета.
znak - это свойство предмета

и нужно по этой таблице сделать поиск предметов, у которых совпадают все свойства.


Цитата:
Сообщение от Русская мафия Посмотреть сообщение
4 - 1
4 - 5
3 - 1
4 - 4
2 - 8
тут у предмета 4 есть 3 свойства: 1,5,4

Вот нужно сделать поиск по этой таблице предметов с совпадением всех свойств
__________________
Как дела?
Русская мафия вне форума   Ответить с цитированием
Старый 14.05.2011, 17:46   #8
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 264
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию

Русская мафия
Это тоже самое, что поиск по инвертированному индексу, который из себя представляет таблицу с полями: doc_id, word_id. У вас предмет обладает набором свойств, а здесь документ имеет набор слов. В общем все тоже самое.

Эксперимент показал, что запрос с джоинами работает быстрее до примерно пяти слов на входе, а выше начинают тормоза расти по экспоненте. А вот запрос с группировкой на коротких фразах работает медленней, зато нет экспонентной зависимости от числа слов. Если критична скорость, то можете скомбинировать оба варианта в зависимости от числа свойств искомых предметов.
boric вне форума   Ответить с цитированием
Старый 14.05.2011, 17:55   #9
Мафиози
 
Аватар для Русская мафия
 
Регистрация: 11.09.2008
Адрес: <H1></H1>
Сообщений: 1,174
Вес репутации: 258
Русская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущееРусская мафия - прекрасное будущее
По умолчанию

boric,спасибо за замеры. Скорость не критична, буду использовать группировку
__________________
Как дела?
Русская мафия вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить запрос mysql Ufaweb Разработка и сопровождение сайтов 30 25.08.2012 17:40
Помогите придумать на какую тему делать сайт. chekunin Курилка 18 18.08.2010 01:50
Помогите придумать домен, пожалуйста. valu0808 Курилка 44 27.07.2009 06:40
Помогите составить SQL запрос? Fredy314 Разработка и сопровождение сайтов 7 02.06.2009 09:19
Помогите придумать домен! ska4ai Курилка 18 08.06.2008 23:18


Часовой пояс GMT +3, время: 05:49.