http://php.ru/forum/viewtopic.php?f=13&t=53982&p=431443#p431443 //1 часть :\ У меня есть в колонке в БД коды категорий. Например 34,87,24 (каждый код отвечает за свою категорию и записаны эти коды по порядку.) Если я пишу вопрос типа Код (Text): SELECT * FROM `base1` WHERE `category` IN ("66") - оно показывает все записи, где первой категорией является 66. Если идет, например, 88,66 - такой записи оно уже не покажет. Не подскажите как вывести такого рода записи?
http://sqlfiddle.com/ сюда вставь SQL запрос на создание таблицы, пару запросов что бы ее забить ну и запрос, как получаешь.
так там внизу надо было вставить следующим запросом, а потом при запросе, сначала выполняется код в левом окне, потом в правом. Вроде как.
http://sqlfiddle.com/#!9/0e630/1 Забил тестовыми данными. Все NOT NULL удалил, ибо много было вводить от руки. Категории забыл. Эт самое важное Добавлено спустя 16 секунд: Посмотрите, прошу.
т.е. ты в ячейку category вставляешь в виде строки цифры через запятую и ты хочешь через IN находить записи в которых содержатся все указанные категории? что то типа "а дайка мне запись которая находится одновременно в категории 172,123 и 96" на сколько мне известно IN работает по другому и она тут не поможет, я когда то делал что то подобное, тут надо по другому, но это по другому не совсем правильно, т.к. будет нагружать базу, через LIKE, короче так: Код (Text): SELECT * FROM `dle_post` WHERE `category` LIKE '%172%' AND `category` LIKE '%123%' AND `category` LIKE '%96%' Вообще лучше заморочся и попробуй по другому решить, сделай таку систему как у Wordpress, из 3-х таблиц, post (аналог твоего dle_post), category там просто имя категории и id и таблица связей, где будет id записи, id записи в таблице post и категория к которой запись относится в виде id, более подробно тут: http://ru.stackoverflow.com/questions/148204/%D0%9E%D1%80%D ... 0%B0%D1%85 А поиск организовать при помощи подобного запроса: viewtopic.php?f=20&t=53589#p428583 через HAVING Вот темы, может они чем то помогут: viewtopic.php?t=50852 viewtopic.php?f=20&t=51139 viewtopic.php?f=20&t=53589 Добавлено спустя 1 минуту 43 секунды: и если сделаешь отпишись по результату, потому что я так и не сделал, не было надобности больше, а интерес остался.
Как вариант Код (Text): select * from dle_post WHERE LOCATE('86', category) and LOCATE('48', category) находит одну строку с category 86,48
Да, я уже догнал. Сделать можно, но реализовать на нём большой фильтр - убийство для хостинга за 15$ в год. попробую - попотею, если получится - отпишусь. Добавлено спустя 51 секунду: А если наоборот 48, 86? Убивать нагрузкой буду
попробуй по системе Wordpress и через запрос с использованием HAVING, вроде как цифры должно искать / считать быстрее, чем строки.
Переписывать часть таблицы, создавать другую, потом выйдет новая версия движка - черт ногу сломит. Добавлено спустя 41 секунду: Попробую модифицировать аккуратно эту таблицу.
а что в DLE категории записываются в текстовое поле через запятую в виде цифр? Добавлено спустя 3 минуты 16 секунд: кстати, тут есть 2 вещи которые могут помочь, первое при добавлении категории получать все категории, сортировать по возрастанию, ну т.е. 96, 123 и 172, а не 172,123 и 96 и потом при формировании запроса на поиск тоже категории сортировать по возрастанию, может как то ускорит.
Дибилизм, не? Интересная идея, можно попробовать. Добавлено спустя 1 минуту 34 секунды: Хотя как ты попробуешь, если это отдельно каждое поле надо сортировать. Это еще хуже будет. И на счет Like %*% Как подставить то данные с моего implode(",", $arr)?
Тоже себе этот вопрос задал. Только что топик нарыл. http://sqlinfo.ru/forum/viewtopic.php?id=1664 В том то и проблема, что я не могу посмотреть, как это у них. Добавлено спустя 1 минуту 34 секунды: Как вариант думал отсортировать каждую ячейку колонки категорий одноразово, потом себе искать. Но тупая затея. При добавлении новых статей все слетит.
и еще, в этом варианте есть косяк: Код (Text): SELECT * FROM `dle_post` WHERE `category` LIKE '%172%' AND `category` LIKE '%123%' AND `category` LIKE '%96%' мы ищем 96, а если будет 196 то оно тоже ее должно выбрать, я надеюсь понятно почему, в моем варианте там хранились записи вот так вот: Код (Text): ,123,172,96, и соответственно: Код (Text): .. LIKE '%,172,%' ..
Трудней всего править чужую работу.. Надо бы отказываться от этого нубодвижка. Да знание php не позволяет. А там легко, как для школоты подключаешь {full-story}, {content} и т.д. Добавлено спустя 3 минуты 37 секунд: Все равно недопонимаю как разделить мою строку типа "4","3","2","1" на 4 части и вставить каждую в Like . Добавлено спустя 4 минуты 49 секунд: На сегодня сдаюсь. Завтра с утра стану на свежую голову перечитаю, прострочу код. А то уже голова видать не варит. Спокойной ночи ребят
я тоже использовал FULLTEXT, но там есть одна загвоздка, ID категории должен начинаться от 4х символов (цифр), т.е. от 1000, FULLTEXT 3 символа и меньше не ищет. но я делал достаточно мощный поиск, я мог что бы обязательно было и желательно и во всех случаях я мог поставить условие ИЛИ, т.е. обязательно должно быть 1000 ИЛИ 2000, но запрос должно выполнялся.
Это я понял. Но все равно не понимаю, как вставить в каждый отдельный Like мой массив с 4-5 элементов. Если бы править входные данные в массив - очень много забирает времени (+ нагрузка). Да и так не получится скорей всего. Если писать шаблон запроса к БД - вообще не получается.. И кстати. А если 172 - первый в ячейке элемент? Все слетит. Но это я решу. Мне бы хоть как-то это запустить.. Добавлено спустя 1 минуту 48 секунд: Мне это не светит. У меня категорий 150. + к этому, не могу посмотреть реализацию этого в самом движке, там скрыто это.
запись в самой ячейке начинается с запятой и заканчивается, т.е. если в ячейке всего одна категория и ты ее получаешь у тебя будет получена такая строчка: Код (Text): ,172, если ты хочешь добавить категорию, ты получаешь те категории что есть сейчас и к ним добавляешь новую, потом тем что получилось, заменяешь запись, по другому ни как. Я как то писал что не хватает типа данных в БД что то вроде - viewtopic.php?f=20&t=53589 но все говорят что я сумасшедший.
Или я тебя не понял, или что. У меня записи в ячейках не имеют запятых в начале и в конце. Значит так. Допустим, у меня в массиве числа 77,64. Количество и значение этих чисел меняется при каждом выполнении скрипта. Если у меня 0 категорий, как добавить новые? Как мне раскинуть массив по этим Like'ам? Если допустим У меня выбрано 0 категорий, как мне вставить эти числа в запрос? Код (Text): SELECT * FROM `dle_post` WHERE `category` LIKE '%Сюда надо вставить 1 значение массива и доавить такой же catergiry like... для следуйщего значения%' Добавлено спустя 16 минут 5 секунд: http://sqlfiddle.com/#!9/0e630/1 да и тут нету запятых. Я что-то не так понял?
сейчас нет, а что бы поиск работал корректно должны быть, и в итоге должно выглядеть так: у тебя НЕТ массива чисел в БД, у тебя есть строка, в которой через запятую перечисляются какие то цифры, строка и массив это разные вещи. Если ты хочешь добавить категорию (например 1000) к записи ты: 1. получаешь те категории что уже есть у записи 2. проверяешь есть там категории или там пусто 3. если не пусто, ты просто в конец этой строчки добавляешь $now.'1000,' и обновляешь эту ячейку (catagory) в БД 4. если пусто, просто пишешь ,1000, и обновляешь эту ячейку (catagory) в БД и так каждый раз, тут я пропустил сортировку, если она конечно будет, так же я пропустил с проверкой, может эта категория уже задана.
Это ясно. Я думал, что ты говоришь, что у меня уже запятые стоят. Лады, попробую, спасибо. Добавлено спустя 36 секунд: Изначально массив, который мы преобразуем в строку)
а раз такая хрень что даже нельзя посмотреть как у них реализовано, может стоит сменить движок на Joomla например, чем вообще этот DLE хорош, ну кроме разве что тех. поддержки в платной версии.