Ответы пользователя по тегу MySQL
  • Логирование трафика в БД - как нормализовать?

    @0LLEGator
    "Начинающий" программист в средней компании.
    На мой взгляд лучше добавить поля к connect_time, правда придётся разрешить в них значения null.
    Не стоит множить сущности без необходимости, а количество полей на скорость не влияют. Тем более что вся инфа в одной таблице и дополнительно джойнить, более того, скорее всего left join-ом, не придётся.
    Ответ написан
    Комментировать
  • Проблема с нужной выборкой?

    @0LLEGator
    "Начинающий" программист в средней компании.
    Можно соорудить простой запрос для подсчёта количества разговоров
    SELECT ifnull(COUNT ( `dl2`.`dialog_id`),0) AS ` dialog_count`
    FROM `dialog_relations` AS `dl1`
    INNER JOIN `dialog_relations`  AS `dl2` USING(`dialog_id`)
    WHERE `dl1`.`user_id` = @user1 AND `dl2`.`user_id` = @user2

    Но в приведённой вами схеме данных такой запрос может завышать количество разговоров, если они есть. Если совпадений нет, то они не появятся. Чтобы этот запрос работал корректно, рекомендую в первой таблице вместо искусственного PK в виде id записи сделать составной PK состоящий из ID разговора и ID участника, тогда он будет отражать суть и предохранять от дублирования записей.

    Для конкретно вашего случая правильно считать количество будет запрос
    SELECT ifnull(COUNT (DISTINCT `dl2`.`dialog_id`),0) AS ` dialog_count`
    FROM `dialog_relations` AS `dl1`
    INNER JOIN `dialog_relations`  AS `dl2` USING(`dialog_id`)
    WHERE `dl1`.`user_id` = @user1 AND `dl2`.`user_id` = @user2


    Чтобы лишь определить наличие разговоров можно сделать "красивее"
    SELECT ifnull(COUNT (DISTINCT `dl2`.`user_id`),0) AS ` dialog_count`
    FROM `dialog_relations` AS `dl1`
    INNER JOIN `dialog_relations`  AS `dl2` USING(`dialog_id`)
    WHERE `dl1`.`user_id` = @user1 AND `dl2`.`user_id` = @user2

    тут 0 - нет диалогов, 1 - есть диалоги.

    P.S. Справедливости ради хочу отметить, что без ifnull'а должно подойти для запроса @akashtrih-а. Единственное, стоит проверить на запросе с отсутствием разговоров между пользователями.
    Ответ написан
    2 комментария
  • Как произвести объединение таблиц в mysql?

    @0LLEGator
    "Начинающий" программист в средней компании.
    А где ответ на первый вопрос, про тип связи? Он самый главный. Видимо "многие-ко-многим".
    "Разруха не в сортирах, разруха в головах"
    Судя по всему, декартово произведение у вас не в запросе, который отрабатывает правильно, а в таблицах, в которых значений мало и они сильно пересекаются, а то и вообще во впечатлении от выборки.
    Запрос выдаёт ВСЕХ пользователей, связанных с КАЖДОЙ записью беседы (видимо всех участников конкретной беседы, если я правильно понял смысл названий.
    Так вот, SQL так устроен, что вместо
    Беседа 1:
    - Участник 1
    - Участник 2
    - Участник 4

    Выводит
    Беседа 1, Участник 1
    Беседа 1, Участник 2
    Беседа 1, Участник 4

    Что не является пересечением (участник 3 не был выведен, т.к. принимал участие в другой беседе), но может таким выглядеть. Рекомендую для теста ввести около 3 бесед и 10 участников, в каждой беседе не более 3 участников в произвольных сочетаниях, и добавьте сортировку по `conversation`.`id_conversation` тогда будет отчётливо видно, как работает.
    И да, изучите вопрос первичных ключей (ПК), их назначения и ОБЯЗАТЕЛЬНО используйте. Здесь, например, исходя из логики запроса напрашиваются`conversation`.`id_conversation`, хотя бы. И нормальные формы БД тоже...
    Для проверки сравните количество строк в запросах
    SELECT * FROM `user_conversation` 
    SELECT * FROM `user_conversation`  WHERE `user_conversation`.`id_conversation` = 1

    С количеством строк, которые выводит ваш запрос.
    Ответ написан
    Комментировать