Подскажите с запросом для выборки из MySQL - Форум успешных вебмастеров - GoFuckBiz.com - Страница 2
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB90.1887
BTC/USD67406.2675
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 21.11.2015, 01:56
Start Post: Подскажите с запросом для выборки из MySQL 
  #11
stikname
true coder;
 
Аватар для stikname
 
Регистрация: 10.05.2013
Сообщений: 28
Бабло: $8575
Отправить сообщение для stikname с помощью ICQ
Question

Задача с выборкой из мускла, есть в бд таблица, в которой один из столбцов имеет значения вроде таких http://cropme.ru/s/f/b/l/3acfd546.png мне нужно сделать выборку по нескольким номерам.

Варианты вроде:
Код:
SELECT * FROM `table` WHERE cat LIKE '%10%' or cat LIKE '%25%' or cat LIKE '%27%';
SELECT * FROM `table` WHERE FIND_IN_SET('10', cat) or FIND_IN_SET('25', cat) or FIND_IN_SET('27', cat);
работают не совсем правильно потому как при выборке результаты не сортируются по количеству совпадений от большего к меньшему.
Первый вариант так вообще херня, особенно если ему задать %1%, то искать он мне будет и 1 и 16 и 21 айди, что не нужно.

Есть варианты какой нужно делать запрос для вывода результатов с сортировкой по количеству совпадений от большего к меньшему?
__________________
http://stik.name - Think different

Последний раз редактировалось stikname; 21.11.2015 в 02:02.
stikname вне форума  
Старый 21.11.2015, 03:52   #12
веломан
сыроед
 
Аватар для веломан
 
Регистрация: 01.10.2015
Сообщений: 15,875
Бабло: $1862675
По умолчанию

Цитата:
Сообщение от editeur Посмотреть сообщение
Код:
select t.*, count(t.id) as cnt from table1 t, cats c
where c.table1_id = t.id
а это считается за JOIN или ?
веломан вне форума  
Старый 21.11.2015, 03:53   #13
editeur
Senior Member
 
Регистрация: 27.09.2013
Сообщений: 697
Бабло: $101520
По умолчанию

Цитата:
Сообщение от веломан Посмотреть сообщение
Код:
select t.*, count(t.id) as cnt from table1 t, cats c
where c.table1_id = t.id
а это считается за JOIN или ?
да, обычный inner join, аналог join cats c on c.table1_id = t.id
editeur вне форума  
Старый 21.11.2015, 15:33   #14
stikname
true coder;
 
Аватар для stikname
 
Регистрация: 10.05.2013
Сообщений: 28
Бабло: $8575
ТС -->
Отправить сообщение для stikname с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от editeur Посмотреть сообщение
сделать еще одну табицу cats
[id первой таблицы][цифра]

и выбирать так
http://sqlfiddle.com/#!9/12b03/13

или перейти на постгрес и использовать поля типа Array.
Можно и таблицу связей делать для айди, но хотелось тут сделать решение именно для такой таблицы как есть сейчас. Постгресс точно не нужен.

Цитата:
Сообщение от lorien Посмотреть сообщение
1) Сколько записей в таблице?
2) Сколько записей обычно попадает в выборку?
3) Сколько фильтров-номеров обычно в выборке используется (запросы LIKE)?
4) Сколько максимально может быть использовано фильтров-номеров в одном запросе?
5) Cколько всего различных значений присутствует в полях cat (кол-во категорий, по сути)?
6) Сколько таких операций поиска проводится в минуту?


Решается добавлением запятых в начало и конец значения в колонке cat и запросами типа LIKE '%,число,%'
1. Сейчас 15к, но может быть и 150к
2. В выборку могут попасть и все записи если будет задано много айди для поиска. Но это в общем не тестировалось
3. В выборке в среднем от 1 до 10 айди за раз
4. Не знаю, ну к примеру 15
5. Примерно до 15
6. Зависит от трафика на сайте, это фактически, выборка похожих видео для ролика, а айди эти, это теги.

Цитата:
Сообщение от editeur Посмотреть сообщение
"Братишка, я тебе покушать принес"
http://sqlfiddle.com/#!9/f6193/22
Спасибо, рабочий вариант, но увы медленно работает. Мне недавно подкинули вариант который в общем выполняет задачу и довольно быстро, по крайней мере на таблице с 15к записей.

Код:
SELECT id,
cat,
if(locate(',10,',concat(',',cat,',')),1,0)+
if(locate(',25,',concat(',',cat,',')),1,0)+
if(locate(',27,',concat(',',cat,',')),1,0) 
as wght

FROM `table` 
order by wght desc
В данном запросе я ищу всё те же айди 10/25/27 , в результате получаю отсортированный по весу столбец, в котором сначала идут строки в которых встречаются все три айди из запроса, потом два, ну и далее пошли бы те где один айди, ну в этом примере не влезает в экран.


Есть идеи как доработать запрос?

В любом случае, спасибо всем за попытку помочь.
__________________
http://stik.name - Think different
stikname вне форума  
Старый 21.11.2015, 16:05   #15
веломан
сыроед
 
Аватар для веломан
 
Регистрация: 01.10.2015
Сообщений: 15,875
Бабло: $1862675
По умолчанию

там наверняка всего 1 раз происходит INSERT в эту таблицу
и 1-2 раза UPDATE/SELECT
я бы на твоём месте переделал по быстрому в нормальную форму и больше голову не грел
при таком то раскладе:
Цитата:
1. Сейчас 15к, но может быть и 150к
2. В выборку могут попасть и все записи если будет задано много айди для поиска. Но это в общем не тестировалось
3. В выборке в среднем от 1 до 10 айди за раз
4. Не знаю, ну к примеру 15
5. Примерно до 15
6. Зависит от трафика на сайте, это фактически, выборка похожих видео для ролика, а айди эти, это теги.
бэкапы не забудь
веломан вне форума  
Старый 21.11.2015, 19:34   #16
stikname
true coder;
 
Аватар для stikname
 
Регистрация: 10.05.2013
Сообщений: 28
Бабло: $8575
ТС -->
Отправить сообщение для stikname с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от веломан Посмотреть сообщение
там наверняка всего 1 раз происходит INSERT в эту таблицу
и 1-2 раза UPDATE/SELECT
я бы на твоём месте переделал по быстрому в нормальную форму и больше голову не грел
при таком то раскладе:

бэкапы не забудь
Не хотелось, но что уж, делаю таблицу связей.
__________________
http://stik.name - Think different
stikname вне форума