powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из двух таблиц с совпадающими значениями из множества других
19 сообщений из 19, страница 1 из 1
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311102
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Очень надеюсь на вашу помощь, поскольку нет понимания каким образом решать этот вопрос

Есть первая таблица с номером поиска и делавшим его уникальным id

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- creating table
CREATE TABLE IF NOT EXISTS `search_uid` (
  `id_search` int(5) NOT NULL,
  `uid` int(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- inserting test data
INSERT INTO `search_uid` (`id_search`, `uid`) VALUES
(1, 111),
(2, 111),
(3, 111),
(4, 222),
(5, 222);


Во второй таблице номер поиска и параметры которые он устанавливал при поиске:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
-- creating table
CREATE TABLE IF NOT EXISTS `search` (
  `id_search` int(5) NOT NULL,
  `setting` varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- inserting test data
INSERT INTO `search` (`id_search`, `setting`) VALUES
(1, 'setting1'),
(1, 'setting2'),
(1, 'setting3'),
(2, 'setting1'),
(2, 'setting3'),
(3, 'setting1'),
(3, 'setting4'),
(3, 'setting3'),
(4, 'setting1'),
(4, 'setting2'),
(5, 'setting3'),
(5, 'setting1');

Вопрос, как получить номер поиска если такой уже был у конкретного пользователя?

Например, если поиск делает пользователь 111 и в поиске ставит параметры setting1 и setting3, то нужно получить 2.

Возможно необходимо организовать по-другому таблицы? Буду очень благодарен за помощь. Если честно не знаю даже что искать в гугле, в каком направлении рыть, кроме как методом прямого перебора :(
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311166
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostap Smirnovпоиск делает пользователь 111 и в поиске ставит параметры setting1 и setting3,
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.id_search
FROM search t1, search_uid t2
WHERE t2.uid = 111
  AND t1.setting IN (`setting1`, `setting3`)
GROUP BY t1.id_search
HAVING COUNT(/* DISTINCT */ t1.setting) = 2
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311168
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
допустим сравнивать строку поиска с GROUP_CONCAT(setting)
проблема в том что если изменить порядок в строке поиска, это не сработает. Значит это откинем.
Вероятно лучше будет при "Например, если поиск делает пользователь 111 и в поиске ставит параметры setting1 и setting3, то нужно получить 2. " получить и 1 и 2 и дать человеку выбор, какой же поиск нужен. Если я понял правильно сие действо.
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311249
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinovдопустим сравнивать строку поиска с GROUP_CONCAT(setting)
проблема в том что если изменить порядок в строке поиска, это не сработает. Значит это откинем.

Да, порядок может быть разный, поэтому откидываем :)

Alex_UstinovВероятно лучше будет при "Например, если поиск делает пользователь 111 и в поиске ставит параметры setting1 и setting3, то нужно получить 2. " получить и 1 и 2 и дать человеку выбор, какой же поиск нужен. Если я понял правильно сие действо.
Наверно не поняли :) В поиске 1 он искал по 3м параметрам, в которые входит setting1 и setting3, но там был еще один параметр и это другой поиск, который выдаст другие результаты... А нам нужно показать что именно этот поиск он уже выполнял, с именно этим набором параметров и если он ищет его постоянно, то предложить сохранить :)
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311251
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaOstap Smirnovпоиск делает пользователь 111 и в поиске ставит параметры setting1 и setting3,
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.id_search
FROM search t1, search_uid t2
WHERE t2.uid = 111
  AND t1.setting IN (`setting1`, `setting3`)
GROUP BY t1.id_search
HAVING COUNT(/* DISTINCT */ t1.setting) = 2



Увы много непонятных команд и я не понимаю почему, но у меня выдает Unknown column 'setting1' in 'where clause'
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311273
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaOstap Smirnovпоиск делает пользователь 111 и в поиске ставит параметры setting1 и setting3,
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.id_search
FROM search t1, search_uid t2
WHERE t2.uid = 111
  AND t1.setting IN (`setting1`, `setting3`)
GROUP BY t1.id_search
HAVING COUNT(/* DISTINCT */ t1.setting) = 2



Ага, кавычки не косые нужны, а прямые...
Ответ вернулся неверный.

С "DISTINCT" вернулись id_search в которых участвовал параметр setting1 и setting3, т.е. вернуло 1,2,3,5... Но они все искались разными пользователями. А нам нужно только те что делал пользователь "111". А без "DISTINCT" выдало пустой результат.
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311322
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostap SmirnovAkinaпропущено...

Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.id_search
FROM search t1, search_uid t2
WHERE t2.uid = 111
  AND t1.setting IN (`setting1`, `setting3`)
GROUP BY t1.id_search
HAVING COUNT(/* DISTINCT */ t1.setting) = 2



Ага, кавычки не косые нужны, а прямые...
Ответ вернулся неверный.

С "DISTINCT" вернулись id_search в которых участвовал параметр setting1 и setting3, т.е. вернуло 1,2,3,5... Но они все искались разными пользователями. А нам нужно только те что делал пользователь "111". А без "DISTINCT" выдало пустой результат.

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


Я бы всетаки предложил , ввиду того что действо наверно частое, дабы избежать гроупбай, на каждые параметры поиска генерировать хеш (пусть даже мд5, или даже контрольную сумму срц32), и искать по нему, а потом уже уточнять. - но если сугубо фильтрация по пользователю, то этот критерий уже достаточно срежет таблицу, и там легко и групбай пройдёт, с другой стороны если сработает индекс по пользователю, то уже не сработает по хешу.

это на случай, если нужно искать подобное без привязки к пользователю, либо на одного пользователя часто могут буть 1000чи разных вариантов поиска(что врядли).
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311354
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT search_uid.uid
FROM search, search_uid
WHERE search_uid.uid = 111
  AND search.id_search = search_uid.id_search
GROUP BY search.id_search
HAVING SUM(search.setting IN ('setting1', 'setting3')) = COUNT(search.setting)
;
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311437
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Код: sql
1.
ваш код 



Вы просто чудо, а не человек :) Спасибо большое. Ничего не говорите, но предлагаете дельные решения. Вижу что двигаемся в нужном направлении... И вроде как после проверки данный запрос сработал, но если добавить еще один параметр, при котором должен быть пустой результат - получается непредсказуемо другой :)

Смотрите, вот такой запрос (тот же пользователь ищет с еще одним параметром), по идее должен быть пустой результат, потому что такого поиска он еще не совершал:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT search_uid.id_search
FROM search, search_uid
WHERE search_uid.uid = '111'
  AND search.id_search = search_uid.id_search
GROUP BY search.id_search
HAVING SUM(search.setting IN ('setting1', 'setting3', 'setting4')) = COUNT(search.setting)



Но нет, получаем 2 ответа: 2 и 3 . Почему так? И вроде как судя по конструкциям логически все должно уже работать...
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311441
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453ну та джойн таблицы где есть юзер айди, и добавить условие выборки для конкретного юзера.

Ээээээ... в эту выборку еще и джоин? У меня мозг взрывается когда я начинаю осмысливать эти джоины :(

alex564657498765453Я бы всетаки предложил , ввиду того что действо наверно частое, дабы избежать гроупбай, на каждые параметры поиска генерировать хеш (пусть даже мд5, или даже контрольную сумму срц32), и искать по нему, а потом уже уточнять. - но если сугубо фильтрация по пользователю, то этот критерий уже достаточно срежет таблицу, и там легко и групбай пройдёт, с другой стороны если сработает индекс по пользователю, то уже не сработает по хешу.

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

Хм, а это интересный вариант... еще отсортировать setting , чтоб хэш совпадал и в принципе да, можно... Но вам не кажется что это все-таки уже как больше костыль, чем решение? ;)
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311449
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostap Smirnov , ну сделайте дубово:
Код: sql
1.
2.
HAVING SUM(search.setting IN ('СписокПараметров')) = 'КоличествоПараметров'
   AND SUM(search.setting NOT IN ('СписокПараметров')) = 0
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311450
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostap Smirnovв эту выборку еще и джоин? У меня мозг взрывается когда я начинаю осмысливать эти джоиныВ моём запросе есть INNER JOIN, просто он записан как декарт с отбором.
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311465
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina Ostap Smirnov , ну сделайте дубово:
Код: sql
1.
2.
HAVING SUM(search.setting IN ('СписокПараметров')) = 'КоличествоПараметров'
   AND SUM(search.setting NOT IN ('СписокПараметров')) = 0



Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT search_uid.id_search
FROM search, search_uid
WHERE search_uid.uid = '111'
  AND search.id_search = search_uid.id_search
GROUP BY search.id_search
HAVING SUM(search.setting IN ('setting1', 'setting3', 'setting4')) = COUNT(search.setting)
AND SUM(search.setting NOT IN ('setting1', 'setting3', 'setting4')) = 0



:( Тот же результат, 2 и 3
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311467
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КоличествоПараметров - это число. В данном случае - 3 (три).
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311468
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, а если вместо COUNT(search.setting) поставить 3 , то результат 3 , что тоже неверно :(
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39311471
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ostap Smirnov,

Простите, есть такой результат, действительно 3 :)
Спасибо. Сейчас буду проверять на других комбинациях.

Еще раз спасибо!
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39312219
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostap Smirnovalex564657498765453ну та джойн таблицы где есть юзер айди, и добавить условие выборки для конкретного юзера.

Ээээээ... в эту выборку еще и джоин? У меня мозг взрывается когда я начинаю осмысливать эти джоины :(

alex564657498765453Я бы всетаки предложил , ввиду того что действо наверно частое, дабы избежать гроупбай, на каждые параметры поиска генерировать хеш (пусть даже мд5, или даже контрольную сумму срц32), и искать по нему, а потом уже уточнять. - но если сугубо фильтрация по пользователю, то этот критерий уже достаточно срежет таблицу, и там легко и групбай пройдёт, с другой стороны если сработает индекс по пользователю, то уже не сработает по хешу.

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

Хм, а это интересный вариант... еще отсортировать setting , чтоб хэш совпадал и в принципе да, можно... Но вам не кажется что это все-таки уже как больше костыль, чем решение? ;)

а есть другой вариант хешировать множество? (множество - набор без порядка следования)

вы хоть понимаете что обычно называют костылём?
называют решение, которое выглядит криво, дабы не переделывать существующую кривизну решения. тобишь костыль априори не может быть в новом коде.
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39312223
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ostap Smirnov,
но подчёркичаю, это если искать надо без привязки пользователя... тоесть что возможно ситуация групировки на тысячи/десятки-тысяч строк. если на 10-20 срок, групировка тоже быстро.
...
Рейтинг: 0 / 0
Выборка из двух таблиц с совпадающими значениями из множества других
    #39314917
Ostap Smirnov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ostap SmirnovХм, а это интересный вариант... еще отсортировать setting , чтоб хэш совпадал и в принципе да, можно... Но вам не кажется что это все-таки уже как больше костыль, чем решение? ;)

alex564657498765453а есть другой вариант хешировать множество? (множество - набор без порядка следования)

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


Хешировать множество по другому? Немного не понял вопроса.
Я так понимаю что если не отсортировать, то хеш будет разный, поэтому только сортировать... Хотя это я просто повторяю что 2*2=4.

Про формулировку "костылей" я не задумывался ;) Но вы правы, в моей фразе правильнее было бы использовать фразу "кривое решение".

alex564657498765453но подчёркичаю, это если искать надо без привязки пользователя... тоесть что возможно ситуация групировки на тысячи/десятки-тысяч строк. если на 10-20 срок, групировка тоже быстро.

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

Я реализовал решение Akina и оно работает. И как говориться, если работает - не трогай :)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из двух таблиц с совпадающими значениями из множества других
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]