ФорумРазработкаБазы данных → GROUP_CONCAT и INNER JOIN`ы

GROUP_CONCAT и INNER JOIN`ы

  • krasun

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

    Spritz Авг. 25, 2010, 12:30 д.п.

    Есть такой запрос:

    SELECT b . * , CONCAT( GROUP_CONCAT( c.name ) ) categories, CONCAT( GROUP_CONCAT( c.id ) ) cid
    FROM books b
    JOIN categories_of_books cb ON b.id = cb.book_id
    JOIN categories c ON c.id = cb.category_id
    GROUP BY b.id


    Все хорошо, он в categories мне пихает, все категории книги, а в cids id`шники всех категории, я потом это обрабатываю и все классно.

    Но если, я добавлю условие WHERE c.category_id = 10, то в categories теперь не будет всех категорий книги, а только та, которую я указал и это понятно.

    Есть ли способ, ограничить условием, но что бы в categories так и оставались все категории.


  • adw0rd

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

    Spritz Авг. 25, 2010, 1:08 д.п., спустя 37 минут 11 секунд

    CONCAT тут зачем? это лишнее
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

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

    Spritz Авг. 25, 2010, 1:10 д.п., спустя 1 минуту 58 секунд

    adw0rd, там инты блобом возвращаются
  • adw0rd

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

    Spritz Авг. 25, 2010, 1:12 д.п., спустя 2 минуты 49 секунд

    юзай вложенный селект или через if-ы разрулить попробуй
    Спустя 78 сек.
    http://pyha.ru/forum/topic/4308.msg91137#msg91137
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

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

    Spritz Авг. 25, 2010, 1:17 д.п., спустя 4 минуты 23 секунды


    юзай вложенный селект или через if-ы разрулить попробуй
    Спустя 78 сек.
    http://pyha.ru/forum/topic/4308.msg91137#msg91137

    Ты имеешь ввиду?

    SELECT b . * , GROUP_CONCAT( c.name ) categories, GROUP_CONCAT(CAST(c.id AS CHAR)) cid
    FROM books b
    JOIN categories_of_books cb ON b.id = cb.book_id
    JOIN categories c ON c.id = cb.category_id
    WHERE b.id in (SELECT categories_of_books.book_id FROM categories_of_books join categories on categories_of_books.category_id = categories.id WHERE categories.id = 10)
    GROUP BY b.id
  • adw0rd

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

    Spritz Авг. 25, 2010, 1:22 д.п., спустя 5 минут 41 секунду

    нет, вложенный селект так:
    SELECT b . * , (SELECT id FROM categories) categories, GROUP_CONCAT(CAST(c.id AS CHAR)) cid …

    так как тебе нужны все категории, а иды не все
    Спустя 54 сек.
    а вообще лучше это несколькими запросами, так как каждый раз ты одни и теже данные получаешь
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

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

    Spritz Авг. 25, 2010, 1:24 д.п., спустя 1 минуту 5 секунд

    мне нужны все категории к книгам, при этом нужно выбрать одну книгу ограничив по категории
    Спустя 24 сек.
    и иды все нужны и категории все
    Спустя 26 сек.
    относящиеся к этой книге
  • adw0rd

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

    Spritz Авг. 25, 2010, 1:27 д.п., спустя 3 минуты 7 секунд

    ясно, утром посмотрю, ссорь
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

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

    Spritz Авг. 25, 2010, 1:28 д.п., спустя 1 минуту 24 секунды

    все норм
    Спустя 21 сек.
    пока оставлю так, но хотелось бы вариант по оптимальней
  • adw0rd

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

    Spritz Авг. 25, 2010, 1:29 д.п., спустя 42 секунды

    будет тебе вариант :)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • krasun

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

    Spritz Авг. 25, 2010, 1:51 д.п., спустя 21 минуту 57 секунд

    ок, посмотри, еще + убрал один join

    SELECT b . * , GROUP_CONCAT( c.name ) categories, GROUP_CONCAT(CAST(c.id AS CHAR)) cid
    FROM books b
    JOIN categories_of_books cb ON b.id = cb.book_id
    JOIN categories c ON c.id = cb.category_id
    WHERE b.id IN (SELECT categories_of_books.book_id FROM categories_of_books WHERE categories_of_books.category_id = 10)
    GROUP BY b.id
  • krasun

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

    Spritz Авг. 25, 2010, 2 д.п., спустя 9 минут 40 секунд

    посмотрим*
  • adw0rd

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

    Spritz Авг. 25, 2010, 4:06 п.п., спустя 14 часов 6 минут 6 секунд

    Так

    SELECT b.*, GROUP_CONCAT(c.name) AS categories_names, GROUP_CONCAT(c.id) AS categories_ids
    FROM categories_of_books AS cb
    LEFT JOIN books AS b ON b.id = cb.book_id
    JOIN categories AS c ON c.id = cb.category_id
    WHERE cb.category_id = 10
    GROUP BY b.id


    Либо так

    SELECT b.*, GROUP_CONCAT(c.name) AS categories_names, GROUP_CONCAT(c.id) AS categories_ids
    FROM books AS b
    LEFT JOIN categories_of_books AS cb ON b.id = cb.book_id
    JOIN categories AS c ON c.id = cb.category_id
    WHERE cb.category_id = 10
    GROUP BY b.id


    Посмотри что быстрее выполняется через explain/профайлинг
    Спустя 46 сек.
    Если не работает, то дай дампы от 3-х таблиц, [email protected]
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Mustafa

    Сообщения: 22 Репутация: N Группа: Кто попало

    Spritz Авг. 18, 2012, 9:03 п.п., спустя 724 дня 4 часа 56 минут

    я живу в Томилино!ответь на мой с начало вопрос

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