За последние 24 часа нас посетили 17063 программиста и 1688 роботов. Сейчас ищут 959 программистов ...

Вывод с БД, тонкости

Тема в разделе "PHP для новичков", создана пользователем VadimPL, 17 июл 2015.

  1. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    http://php.ru/forum/viewtopic.php?f=13&t=53982&p=431443#p431443 //1 часть :\

    У меня есть в колонке в БД коды категорий. Например 34,87,24 (каждый код отвечает за свою категорию и записаны эти коды по порядку.)

    Если я пишу вопрос типа
    Код (Text):
    1. SELECT * FROM `base1` WHERE `category` IN ("66")
    - оно показывает все записи, где первой категорией является 66. Если идет, например, 88,66 - такой записи оно уже не покажет.

    Не подскажите как вывести такого рода записи?
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    http://sqlfiddle.com/

    сюда вставь SQL запрос на создание таблицы, пару запросов что бы ее забить ну и запрос, как получаешь.
     
  3. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Может лучше експортну 2 таблицы и скрипт сюда скину? Так быстрей будет.
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну чем проще это потом будет вставить в http://sqlfiddle.com/ тем больше шансов что тебе помогут.
     
  5. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Лады.
    http://sqlfiddle.com/#!9/edab8
    Вот таблица. Как туда тестовых данных залить?
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    так там внизу надо было вставить следующим запросом, а потом при запросе, сначала выполняется код в левом окне, потом в правом.
    Вроде как.
     
  7. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    http://sqlfiddle.com/#!9/0e630/1
    Забил тестовыми данными. Все NOT NULL удалил, ибо много было вводить от руки. Категории забыл. Эт самое важное

    Добавлено спустя 16 секунд:
    Посмотрите, прошу.
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    т.е. ты в ячейку category вставляешь в виде строки цифры через запятую и ты хочешь через IN находить записи в которых содержатся все указанные категории? что то типа "а дайка мне запись которая находится одновременно в категории 172,123 и 96"

    на сколько мне известно IN работает по другому и она тут не поможет, я когда то делал что то подобное, тут надо по другому, но это по другому не совсем правильно, т.к. будет нагружать базу, через LIKE, короче так:
    Код (Text):
    1. 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 секунды:
    и если сделаешь отпишись по результату, потому что я так и не сделал, не было надобности больше, а интерес остался.
     
  9. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    Как вариант
    Код (Text):
    1. select * from dle_post WHERE LOCATE('86', category) and LOCATE('48', category)
    находит одну строку с category 86,48
     
  10. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Да, я уже догнал.

    Сделать можно, но реализовать на нём большой фильтр - убийство для хостинга за 15$ в год.

    попробую - попотею, если получится - отпишусь.

    Добавлено спустя 51 секунду:
    А если наоборот 48, 86? Убивать нагрузкой буду :)
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    попробуй по системе Wordpress и через запрос с использованием HAVING, вроде как цифры должно искать / считать быстрее, чем строки.
     
  12. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Переписывать часть таблицы, создавать другую, потом выйдет новая версия движка - черт ногу сломит.

    Добавлено спустя 41 секунду:
    Попробую модифицировать аккуратно эту таблицу.
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а что в DLE категории записываются в текстовое поле через запятую в виде цифр?

    Добавлено спустя 3 минуты 16 секунд:
    кстати, тут есть 2 вещи которые могут помочь, первое при добавлении категории получать все категории, сортировать по возрастанию, ну т.е. 96, 123 и 172, а не 172,123 и 96 и потом при формировании запроса на поиск тоже категории сортировать по возрастанию, может как то ускорит.
     
  14. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Дибилизм, не? :)
    Интересная идея, можно попробовать.

    Добавлено спустя 1 минуту 34 секунды:
    Хотя как ты попробуешь, если это отдельно каждое поле надо сортировать. Это еще хуже будет. И на счет Like %*%
    Как подставить то данные с моего implode(",", $arr)?
     
  15. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а встроенного поиска по категориям нет? как они это реализовали?
     
  16. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Тоже себе этот вопрос задал. Только что топик нарыл.
    http://sqlinfo.ru/forum/viewtopic.php?id=1664
    В том то и проблема, что я не могу посмотреть, как это у них.

    Добавлено спустя 1 минуту 34 секунды:
    Как вариант думал отсортировать каждую ячейку колонки категорий одноразово, потом себе искать. Но тупая затея. При добавлении новых статей все слетит.
     
  17. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    и еще, в этом варианте есть косяк:
    Код (Text):
    1. SELECT * FROM `dle_post` WHERE `category` LIKE '%172%' AND `category` LIKE '%123%' AND `category` LIKE '%96%'
    мы ищем 96, а если будет 196 то оно тоже ее должно выбрать, я надеюсь понятно почему, в моем варианте там хранились записи вот так вот:
    Код (Text):
    1. ,123,172,96,
    и соответственно:
    Код (Text):
    1. .. LIKE '%,172,%' ..
     
  18. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Трудней всего править чужую работу.. Надо бы отказываться от этого нубодвижка. Да знание php не позволяет. А там легко, как для школоты подключаешь {full-story}, {content} и т.д.

    Добавлено спустя 3 минуты 37 секунд:
    Все равно недопонимаю как разделить мою строку типа "4","3","2","1" на 4 части и вставить каждую в Like .

    Добавлено спустя 4 минуты 49 секунд:
    На сегодня сдаюсь. Завтра с утра стану на свежую голову перечитаю, прострочу код. А то уже голова видать не варит. Спокойной ночи ребят:)
     
  19. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    я тоже использовал FULLTEXT, но там есть одна загвоздка, ID категории должен начинаться от 4х символов (цифр), т.е. от 1000, FULLTEXT 3 символа и меньше не ищет.

    но я делал достаточно мощный поиск, я мог что бы обязательно было и желательно и во всех случаях я мог поставить условие ИЛИ, т.е. обязательно должно быть 1000 ИЛИ 2000, но запрос должно выполнялся.
     
  20. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Это я понял. Но все равно не понимаю, как вставить в каждый отдельный Like мой массив с 4-5 элементов. Если бы править входные данные в массив - очень много забирает времени (+ нагрузка). Да и так не получится скорей всего.

    Если писать шаблон запроса к БД - вообще не получается..

    И кстати.
    А если 172 - первый в ячейке элемент? Все слетит. Но это я решу. Мне бы хоть как-то это запустить..

    Добавлено спустя 1 минуту 48 секунд:
    Мне это не светит. У меня категорий 150. + к этому, не могу посмотреть реализацию этого в самом движке, там скрыто это.
     
  21. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    запись в самой ячейке начинается с запятой и заканчивается, т.е. если в ячейке всего одна категория и ты ее получаешь у тебя будет получена такая строчка:
    Код (Text):
    1. ,172,
    если ты хочешь добавить категорию, ты получаешь те категории что есть сейчас и к ним добавляешь новую, потом тем что получилось, заменяешь запись, по другому ни как.

    Я как то писал что не хватает типа данных в БД что то вроде - viewtopic.php?f=20&t=53589 но все говорят что я сумасшедший.
     
  22. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Или я тебя не понял, или что. У меня записи в ячейках не имеют запятых в начале и в конце.
    [​IMG]

    Значит так. Допустим, у меня в массиве числа 77,64. Количество и значение этих чисел меняется при каждом выполнении скрипта. Если у меня 0 категорий, как добавить новые? Как мне раскинуть массив по этим Like'ам?
    Если допустим
    У меня выбрано 0 категорий, как мне вставить эти числа в запрос?
    Код (Text):
    1. SELECT * FROM `dle_post` WHERE `category` LIKE '%Сюда надо вставить 1 значение массива и доавить такой же catergiry like... для следуйщего значения%'
    Добавлено спустя 16 минут 5 секунд:
    http://sqlfiddle.com/#!9/0e630/1
    да и тут нету запятых. Я что-то не так понял?
     
  23. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    сейчас нет, а что бы поиск работал корректно должны быть, и в итоге должно выглядеть так:
    [​IMG]


    у тебя НЕТ массива чисел в БД, у тебя есть строка, в которой через запятую перечисляются какие то цифры, строка и массив это разные вещи.

    Если ты хочешь добавить категорию (например 1000) к записи ты:
    1. получаешь те категории что уже есть у записи
    2. проверяешь есть там категории или там пусто
    3. если не пусто, ты просто в конец этой строчки добавляешь $now.'1000,' и обновляешь эту ячейку (catagory) в БД
    4. если пусто, просто пишешь ,1000, и обновляешь эту ячейку (catagory) в БД

    и так каждый раз, тут я пропустил сортировку, если она конечно будет, так же я пропустил с проверкой, может эта категория уже задана.
     
  24. VadimPL

    VadimPL Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    37
    Симпатии:
    0
    Адрес:
    Warsaw, Poland
    Это ясно. Я думал, что ты говоришь, что у меня уже запятые стоят:). Лады, попробую, спасибо.

    Добавлено спустя 36 секунд:
    Изначально массив, который мы преобразуем в строку)
     
  25. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а раз такая хрень что даже нельзя посмотреть как у них реализовано, может стоит сменить движок на Joomla например, чем вообще этот DLE хорош, ну кроме разве что тех. поддержки в платной версии.