За последние 24 часа нас посетили 18004 программиста и 1648 роботов. Сейчас ищут 1746 программистов ...

Выбрать 2 строки у которых максимально количество пересечений дочерних элементов

Тема в разделе "MySQL", создана пользователем Matpewka, 3 мар 2017.

  1. Matpewka

    Matpewka Новичок

    С нами с:
    3 мар 2017
    Сообщения:
    6
    Симпатии:
    2
    Есть 3 таблицы:
    authors:
    id
    name


    books:
    id
    title


    author_books:
    author_id
    book_id



    Задача: выбрать 2-х авторов, которые чаще всего работали вместе ( над одной книгой ).
     
  2. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    У самого какие мысли по этому поводу?
     
  3. Matpewka

    Matpewka Новичок

    С нами с:
    3 мар 2017
    Сообщения:
    6
    Симпатии:
    2
    1. выбрать все id авторов.
    2. Затем (рекурсивно?) выбирать из таблицы author_books пересечения с другими авторами.
    Код (Text):
    1.  
    2. SELECT author_id FROM author_book WHERE book_id IN ( SELECT book_id FROM author_book WHERE author_id = @author)  and author_id != @author GROUP BY author_id ORDER BY DESC
    и вот как-то это обернуть в рекурсию и в итоге получить 2 и более строк у которых будет одинаковое число совместных книг...

    Не получается описать в sql, да и в мыслях как-то сумбурно )
     
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Ты что, хочешь одним запросом это получить?)))
    это нереал имхо. Тут надо городить кучу php-кода.
    --- Добавлено ---
    пока что в голову приходит одна шизофрения на костылях))
    утром надо будет подумать. Задача очень интересная...
     
  5. Drema

    Drema Новичок

    С нами с:
    20 фев 2017
    Сообщения:
    117
    Симпатии:
    30
    Код (Text):
    1. SELECT ab1.id_author, ab2.id_author, COUNT(*)
    2. FROM books b
    3. INNER JOIN author_books ab1 ON ab1.id_book = b.id
    4. INNER JOIN author_books ab2 ON ab2.id_book = b.id
    5. WHERE ab1.id_author <> ab2.id_author
    6. GROUP BY ab1.id_author, ab2.id_author
    7. ORDER BY 3 DESC
    8. LIMIT 1
     
    Fell-x27 и TeslaFeo нравится это.
  6. Matpewka

    Matpewka Новичок

    С нами с:
    3 мар 2017
    Сообщения:
    6
    Симпатии:
    2
    Благодарю, всё просто и лаконично.
     
    Fell-x27 и denis01 нравится это.
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Каждый раз, когда такое приходит в голову, сразу вспоминай о JOIN-ах. Это вот верный признак, что без них никак.
     
  8. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    68
    Симпатии:
    22
    @Drema
    таблица books в запросе избыточна

    решение подойдет только для случая, когда при наличии несколько комбинаций авторов чаще всего работавших вместе, нужно выбрать только 1 случайную.