Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SPLIT() в мускл 
:(
    Опции темы
bars80080
Дата 19.1.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 5
Всего: 315



есть такой запрос:

Код

SELECT `word` FROM `table1` WHERE `id` IN (SELECT `words` FROM `table2` WHERE `param`=1)


в поле table2.words находится строка вида: 1,2,3,4,6,7,8,9,10,5,19,32,45,20,33,46,21,34,22,35,23,36,11,24,37 - это и есть идентификаторы слов из таблицы1.
однако, при такой постановке запроса `id` IN () выбирается только первый элемент из строки. он видимо прогоняет через что-то типа intval().
это можно было бы решить, если бы существовала функция разбиения строки на массив, а конструкция могла бы его обработать. однако, даже такого типа, как массив я в доках не обнаружил

как бы вообще справиться с этой ситуацией?
PM MAIL WWW   Вверх
Akina
Дата 19.1.2011, 21:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Т.е. тебе нужна какая-то хрень типа
Код

Where CONCAT(',',table2.word,',') LIKE CONCAT('%,',table1.word,',%')

Надеюсь, уже понятно, что нужно срочно менять структуру хранения данных?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bars80080
Дата 20.1.2011, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 5
Всего: 315



это не структура хранения данных, это подставка - то есть заготовленный заранее результат поиска. 
есть таблица где указывается вес слова в каждом конкретном тексте, там все данные чинно и благородно распиханы по числовым полям и с индексами. но мне нужно для каждой фиксированной группы текстов иметь набор 25 наиболее весомых слов. эта выборка однообразная, она будет повторяться каждый раз, но городить здоровый запрос по таблице, которая будет весить 50-400МБ - и это только числовые данные, чересчур.
мне гораздо проще при редакции текста пересчитывать один раз эту выборку и заносить её в отдельную табличку, к которой идёт простой запрос с одним WHERE. при том, что записей в этой таблице вряд ли превысит 500к
изменение текста - это гораздо более редкое явление, чем чтение

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

SELECT `word` FROM `table1` WHERE `id` IN (1,2,3,4,6,7,8,9,10,5,19,32,45,20,33,46,21,34,22,35,23,36,11,24,37)

то всё нормально, а если:

SELECT `word` FROM `table1` WHERE `id` IN (SELECT `words` FROM `table2` WHERE `param`=1)

то получаю результат словно: SELECT `word` FROM `table1` WHERE `id` IN (1)




что-то мне твоё предложение из-за LIKE не нравится. может проще будет в два запроса:

Код

$sql = 'SELECT `words` FROM `table2` WHERE `param`=1 LIMIT 1';
$r = my_select($sql);
$sql = 'SELECT `word` FROM `table1` WHERE `id` IN ('.$r.') ORDER BY FIELD('.$r.')';

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


PM MAIL WWW   Вверх
skyboy
Дата 20.1.2011, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(bars80080 @  19.1.2011,  23:12 Найти цитируемый пост)
, а если:

SELECT `word` FROM `table1` WHERE `id` IN (SELECT `words` FROM `table2` WHERE `param`=1)

то получаю результат словно: SELECT `word` FROM `table1` WHERE `id` IN (1)

не-а, у тебя результат такой же, как и при запросе:
Код

SELECT `word` FROM `table1` WHERE `id` IN ('1,2,3,4,6,7,8,9,10,5,19,32,45,20,33,46,21,34,22,35,23,36,11,24,37')

ну, не может строка восприниматься как код! 
собственно, ты и делаешь строку частью кода, когда в динамически формируемый запрос при помощи РНР вставляешь эту строку. 
хочешь делать при помощи PHP? пожалуйста. это до тех пор, пока тебе не потребуется сделать JOIN двух таблиц с последующей фильтрацией(а не как сейчас - выбрали одну запись и из её поля word вытянули до десятка записей из другой таблицы). 
Цитата(bars80080 @  19.1.2011,  23:12 Найти цитируемый пост)
что-то мне твоё предложение из-за LIKE не нравится

с той же идеей можно использовать более простой и принципиально более быстрый locate. но это не меняет проблемы - в таком соединении никакого типа индексы использоваться не будут. т.е. адские тормоза уже на небольшом количество входящих данных.
PM MAIL   Вверх
Zloxa
Дата 20.1.2011, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(bars80080 @  20.1.2011,  00:12 Найти цитируемый пост)
 проще будет в два запроса:

так и надо smile 
некоторые умники называют это "динамическое формирование запроса".
минусы, соответственно - очевидны.
Возможность инъекций, невозможность на этапе проектирования гарантировать работоспособность и контролировать план.

Это сообщение отредактировал(а) Zloxa - 20.1.2011, 10:51


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
bars80080
Дата 20.1.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 5
Всего: 315



Цитата(skyboy @  20.1.2011,  08:27 Найти цитируемый пост)
но это не меняет проблемы - в таком соединении никакого типа индексы использоваться не будут. т.е. адские тормоза уже на небольшом количество входящих данных. 

почему нет?

в SELECT `words` FROM `table2` WHERE `param`=1 LIMIT 1 
у меня индекс на param, больше никак иначе искаться не будет
в SELECT `word` FROM `table1` WHERE `id` IN ('.$r.') ORDER BY FIELD('.$r.')
индекс на id
разве при комбинации запросов в один индексы не используются?


Цитата(skyboy @  20.1.2011,  08:27 Найти цитируемый пост)
пока тебе не потребуется сделать JOIN двух таблиц с последующей фильтрацией(а не как сейчас - выбрали одну запись и из её поля word вытянули до десятка записей из другой таблицы). 

мне не нужен никакой join. когда потребуется иная выборка, у меня будут обращения к базовой таблице, где есть id_word int, param int, weight int. сложные выборки будут оттуда.


Цитата(Zloxa @  20.1.2011,  09:44 Найти цитируемый пост)
так и надо

ну, значит так и будем

хотя, честно говоря, не думал что mysql так ограничен, что в нём массивов вообще нет
PM MAIL WWW   Вверх
Zloxa
Дата 20.1.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(bars80080 @  20.1.2011,  10:58 Найти цитируемый пост)
отя, честно говоря, не думал что mysql так ограничен, что в нём массивов вообще нет 

Ровно в той же степени, как и ограничен ПХП. Там есть массивы, но жоинить и аггрегировать он их не умеет  smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.