ФорумПрограммированиеPHP для идиотов → поиск в базе данных

поиск в базе данных

  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 19:10

    Возникла проблема поиска по БД.

    Организация БД, например, автомобилей:

    autos

    | id | title | description | …
    | 1 | nissan | Good Car! | …



    autoparts
    | id | name | weight | …
    | 1 | motor | 480 | …
    | 2 | tire | 100 | …


    connections
    | car | autopart |
    | 1 | 2 |


    Форма ввода:

    Пользователь, указывает запчасти, например: мотор, шины. (array of autoparts).
    Также пользователь указывает: "искать включительно с указанными запчастями" или "искать только с указанными запчастями".

    Нужно вывести машины, которые соответствуют запросу.

    Как это хоть приблизительно можно реализовать?
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 2 июля 2009 г. 19:15, спустя 4 минуты 42 секунды

    тебя поиск интересует или вывод результатов?
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 19:22, спустя 7 минут 18 секунд

    интересует сама организация поиска в бд, думал о вложенных select`ах, сначала выбирать по первой запчасти, потом в том, что вышло, по второй и так далее.
    потом думал, о создании временной таблице, в которую запись, например, только по первой запчасти, а потом как -то из нее удалять не нужное, после чего вытащить из нее результат, то есть в принципе хоть какой-нить алгоритм я придумал, а вот как это в MySQL организовать я не знаю
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 2 июля 2009 г. 19:24, спустя 2 минуты 24 секунды

    ты знаешь что-нибудь про join?
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 19:30, спустя 5 минут 56 секунд

    возможно он объединяет таблицы по какому нибудь признаку
    Спустя 277 сек.
    может где нибудь есть статьи про подобный тип поиска?
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 2 июля 2009 г. 19:32, спустя 1 минуту 32 секунды

    Да, это для объединения результатов из разных таблиц, я так думаю это то, что тебе нужно?
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 19:45, спустя 13 минут 34 секунды

    adword, ну не совсем, может я не правильно задал вопрос. Допустим, еще пример.

    Разбиваю текст "Малинки" (Какие же вкусные бывают красные малины) по словам, и записываю в таблицу

    words
    | id | word      |
    ——————-
    | 1 | Какие     |
    | 2 | же          |
    | 3 | вкусные  |
    | 4 | бывают  |
    | 5 | красные |
    | 6 | малины   |

    Далее записываю название текста в отдельную таблицу:

    texts
    | id | title             |
    ——————-
    | 1 |  Малинки     |

    После чего создаю связи

    connections
    | text_id | word_id |
    ——————-
    |  1         |       1      |
    |  1         |       2      |
    |  1         |       3      |
    |  1         |       4      |
    |  1         |       5      |
    |  1         |       6      |


    Добавляю новый текст "Клубнички" (Вкусные и красные, епть!), опять разбиваю по словам, "красные" записывать не буду, так как есть уже.
    "вкусные" тоже, добавлю "епть" и "и"(про "и" не знаю еще, стоит ли добавлять).

    words
    | id | word      |
    ——————-
    | 1 | Какие     |
    | 2 | же          |
    | 3 | вкусные  |
    | 4 | бывают  |
    | 5 | красные |
    | 6 | малины   |
    | 7 | епть       |
    | 8 |  и            |

    Теперь в таблицу texts, добавляю "Клубнички":

    texts
    | id | title             |
    ——————-
    | 1 |  Малинки     |
    | 2 | Клубнички   |

    и опять создаю связи:

    connections
    | text_id | word_id |
    ——————-
    |  1         |       1      |
    |  1         |       2      |
    |  1         |       3      |
    |  1         |       4      |
    |  1         |       5      |
    |  1         |       6      |
    |   2        |       3      |
    |   2        |       8      |
    |   2        |       5      |
    |   2        |       7      |

    ——————————————————————————————————-

    Пользователь вводит запрос: "красные, вкусные" и указывает "искать включительно с указанными словами"

    Результат:
    "Клубнички"

    запрос: "красные",  "искать включительно с указанными словами"
    результат:
    "Малинки", "Клубнички"

    ____________________________________

    Я просто не знаю как это сделать с помощью JOIN.


  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 2 июля 2009 г. 20:07, спустя 21 минуту 34 секунды

    дай дамп данных, я составлю тебе join
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 20:22, спустя 15 минут 4 секунды

    Текст:

    Малинки
    Красные и суперски красные и суперски вкусные

    Клубнички
    Вкусные и красные

    Огурцы
    Зеленые и не вкусные

    Помидоры
    Красные, свежие супер мега помидоры


    дамп

  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 2 июля 2009 г. 20:53, спустя 31 минуту 15 секунд


    select `t`.`title` from `words` as `w`
    left join `connections` as `c` on `c`.`idWord` = `w`.`id`
    left join `titles` as `t` on `t`.`id` = `c`.`idTitle`
    where `w`.`word` like "красные";
    Спустя 131 сек.
    http://www.codinghorror.com/blog/archives/000976.html
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 20:57, спустя 3 минуты 54 секунды

    очень благодарен. скажите, а если не сколько слов, то в where добавить or.
    Спустя 125 сек.
    adw0rd, скажите, а как создать страничку в wiki, а то я там не могу найти
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 2 июля 2009 г. 21:04, спустя 6 минут 55 секунд

    очень благодарен. скажите, а если не сколько слов, то в where добавить or.

    либо OR, либо AND

    ***
    так же рекомендую поиск делать:

    • либо через http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
      MATCH (col1,col2,…) AGAINST (expr  [search_modifier])

      не забывая про full-text индексы

    • либо юзаем sphinx

    Спустя 82 сек.
    adw0rd, скажите, а как создать страничку в wiki, а то я там не могу найти

    я делаю так: пишу в поиске название документа и если его нет система предлагает его создать и создаю :)
    а вы зарегистрированы в википроекте?
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 21:11, спустя 7 минут 17 секунд



    Спустя 82 сек.
    adw0rd, скажите, а как создать страничку в wiki, а то я там не могу найти

    я делаю так: пишу в поиске название документа и если его нет система предлагает его создать и создаю :)
    а вы зарегистрированы в википроекте?


    да, только что зарегистрировался, сейчас хочу добавить две функции Imagick:: adaptiveSharpenImage, Imagick:: adaptiveThresholdImage. Я сначала просто попытаюсь перевести, а потом установлю Imagick поиграюсь с ним, и тогда подточу перевод.
    Спустя 29 сек.
    а то я получается, что я не вижу о чем пишу, а это очень мешает
  • adw0rd

    Сообщения: 22908 Репутация: N Группа: в ухо

    Spritz 2 июля 2009 г. 21:19, спустя 7 минут 6 секунд

    krasun, тогда отредактируйте документ http://wiki.adw0rd.ru/index.php/IMagick (сверху кнопка "править", после авторизации доступна)

    посмотрите как там сделано для "Imagick::adaptiveResizeImage…" и подобно сделайте для "Imagick::adaptiveSharpenImage"

    после чего сохраните документ и перейдите по созданной вами ссылке, далее редактируйте этот документ, на который перешли
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 июля 2009 г. 21:30, спустя 11 минут 12 секунд

    все вроде бы разобрался
    Спустя 455 сек.
    не знаю, почему, но съезжает список параметров, верстаю вроде бы правильно http://wiki.adw0rd.ru/index.php/Imagick:adaptiveSharpenImage#.D0.A1.D0.BF.D0.B8.D1.81.D0.BE.D0.BA_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D0.BE.D0.B2

Пожалуйста, авторизуйтесь, чтобы написать комментарий!