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

GROUP_CONCAT и INNER JOIN`ы

  • krasun

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

    Spritz 24 августа 2010 г. 16: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

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

    Spritz 24 августа 2010 г. 17:08, спустя 37 минут 11 секунд

    CONCAT тут зачем? это лишнее
    adw/0
  • krasun

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

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

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

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

    Spritz 24 августа 2010 г. 17:12, спустя 2 минуты 49 секунд

    юзай вложенный селект или через if-ы разрулить попробуй {+++78+++} http://pyha.ru/forum/topic/4308.msg91137#msg91137
    adw/0
  • krasun

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

    Spritz 24 августа 2010 г. 17: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

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

    Spritz 24 августа 2010 г. 17:22, спустя 5 минут 41 секунду

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

    так как тебе нужны все категории, а иды не все {+++54+++} а вообще лучше это несколькими запросами, так как каждый раз ты одни и теже данные получаешь
    adw/0
  • krasun

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

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

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

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

    Spritz 24 августа 2010 г. 17:27, спустя 3 минуты 7 секунд

    ясно, утром посмотрю, ссорь
    adw/0
  • krasun

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

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

    все норм {+++21+++} пока оставлю так, но хотелось бы вариант по оптимальней
  • adw0rd

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

    Spritz 24 августа 2010 г. 17:29, спустя 42 секунды

    будет тебе вариант :)
    adw/0
  • krasun

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

    Spritz 24 августа 2010 г. 17: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

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

    Spritz 24 августа 2010 г. 18:00, спустя 9 минут 40 секунд

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

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

    Spritz 25 августа 2010 г. 8: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]
    adw/0
  • Mustafa

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

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

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

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