ФорумРазработкаБазы данных → Обьясните запрос

Обьясните запрос

  • ukroficer

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

    Spritz Фев. 26, 2013, 1:53 д.п.

    SELECT *
    FROM (`video_albums`)
    JOIN `video` ON `video_albums`.`id` = `video`.`id_album`
    WHERE `video_albums`.`status` = '1'
    AND `video`.`status` = '1'
    AND `video`.`main` = '1'
    GROUP BY `video_albums`.`id`, `video`.`id` %2
    Он собака работает как мне нужно но его понять я не могу,вот эта часть волнует(GROUP BY `video_albums`.`id`, `video`.`id` %2 ).
  • artoodetoo

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

    Spritz Фев. 26, 2013, 9:48 д.п., спустя 7 часов 55 минут 3 секунды

    Когда просишь поучаствовать, то оформляй так, чтобы твой пост читался макс. удобно - код загони в
     

    Во вторых тут налицо логическая ошибка: запросы с GROUP BY нельзя оформлять с SELECT *. То что это не просигналено как ошибка – это тупняк майсиквельный, при некоторых настройках он ВНЕЗАПНО будет признан ошибкой.
    Вот реально по сути группировки не про все поля можно сказать что именно они должны содержать, так что считай там выводится случайная запись. Пиши явно список полей – короткий список )))

    Третье:
    вот эта часть волнует(GROUP BY `video_albums`.`id`, `video`.`id` %2 ).

    Ну правильно ты не можешь понять. Я тоже не могу ))) "группировать по видеоальбомам и чётности видео" это хуйня какая-то. В сочетании с тем, что ты пытаешся вывести просто все поля двух таблиц после группировки, это просто непонятное мессиво.

    Что должно получаться в итоге?
    Спустя 154 сек.
    P.S. Попробуй заменить весь GROUP BY на
    ORDER BY `video_albums`.`id`

    мне кажется ничего не изменится, но это будет "правильный" запрос
    ιιlllιlllι унц-унц
  • ukroficer

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

    Spritz Фев. 26, 2013, 3:01 п.п., спустя 5 часов 13 минут 18 секунд

    Данный запрос (это пример) данный запрос выбирает по два видео к каждому альбому, на счет SELECTA я просто накидал
    Спустя 124 сек.
    P.S. Попробуй заменить весь GROUP BY на

    ORDER BY `video_albums`.`id`

    мне кажется ничего не изменится, но это будет "правильный" запрос

    ты прав тебе кажеться
  • AlexB

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

    Spritz Фев. 26, 2013, 3:13 п.п., спустя 12 минут 16 секунд

    ukroficer, так в чем вопрос собственно, ты не понимаешь что такое GROUP BY?
  • ukroficer

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

    Spritz Фев. 26, 2013, 3:20 п.п., спустя 7 минут 14 секунд

    Что такое GROUP BY я понимаю не понимаю почему
     GROUP BY `video_albums`.`id`, `video`.`id` %2
    Спустя 43 сек.
    и дает то что мне нужно я получаю две записи каждой категории в данном случае 2 видео каждого альбома
  • AlexB

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

    Spritz Фев. 26, 2013, 5:26 п.п., спустя 2 часа 5 минут 47 секунд

    Значит не понимаешь. GROUP BY как  бы склеивает множество строк результата запроса в одну строку (группировка) про критерию уникальности комбинации полей после GROUP BY.
    Во у тебя и получается на каждый  `video_albums`.`id приходится два возможных значения `video`.`id` % 2 (остаток от деления на два - ноль и единица)
    итого две строки.

    Другой вопрос, что решать эту задачу таким образом некорректно, что тебе и объяснил artoodetoo.
  • artoodetoo

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

    Spritz Фев. 26, 2013, 7:54 п.п., спустя 2 часа 27 минут 17 секунд

    AlexB, помоему ему похуй. нам должно быть тем более похуй.
    ιιlllιlllι унц-унц
  • artoodetoo

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

    Spritz Фев. 26, 2013, 8:16 п.п., спустя 22 минуты 45 секунд

    кстати, хоть эта тема говняцкая, но я я узнал новый грязный хак. спасибо автору )))
    нифига себе! что тут еще скажешь.

    да, order by здесь будет работать по другому, это я ошибся, признаю. тем не менее за составом полей в SELECT надо следить, это по прежнему в силе.
    ιιlllιlllι унц-унц
  • AlexB

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

    Spritz Фев. 26, 2013, 8:20 п.п., спустя 4 минуты 4 секунды


    кстати, хоть эта тема говняцкая, но я я узнал новый грязный хак.
    ага, я тоже такого изврата раньше не видел и тоже не сходу въехал, пока вы обсуждать не начали …
    но хак достаточно грубый и ненадежный ибо предполагает, что всегда есть четные и нечетные id, что вообще не обязательно ни разу
  • ukroficer

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

    Spritz Фев. 26, 2013, 10:23 п.п., спустя 2 часа 2 минуты 39 секунд

    Да нет четный и не четные тут не при чем… ну я так и думал про остаток но все таки почему этого нет в доке… а как бы вы решили эту задачу?
    Спустя 178 сек.
    если там одно видео в альбоме то оно берет одно при чем тут.. четные не четные.
  • AlexB

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

    Spritz Фев. 27, 2013, 1:03 д.п., спустя 2 часа 39 минут 43 секунды


    а как бы вы решили эту задачу?
    А я так и не понял в чем задача, извлечь первые попавшиеся два видео для каждого альбома без всякого критерия?


    если там одно видео в альбоме то оно берет одно при чем тут.. четные не четные.
    А если два с id=1 и id=3 ?
  • ukroficer

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

    Spritz Фев. 27, 2013, 2:23 д.п., спустя 1 час 20 минут 20 секунд

    Зада простоя вывести одним запросом два видео с каждого альбома.
  • artoodetoo

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

    Spritz Фев. 27, 2013, 6:55 д.п., спустя 4 часа 32 минуты 17 секунд

    вывести одним запросом два видео с каждого альбома.


    я не знаю простого решения. limit здесь не получается применить, а функций типа оракловой row_number() в мускуле нет. недавно очень близкую задачу помогал разрулить. две таблицы, на каждую запись из одной надо выдать 3 первые записи (в календарном порядке) из другой. см. здесь. условие похожее но там немного посложнее - с сортировкой

    в общем если брать "любые две записи", то твой вариант интересный хотя непонятный
    ιιlllιlllι унц-унц
  • AlexB

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

    Spritz Фев. 28, 2013, 12:15 д.п., спустя 17 часов 20 минут

    GROUP_CONCAT и explode на стороне PHP, наверно самое простое … во всяком случае всегда корректно будет работать при таком же плане запроса.
    В постгресе можно было бы поумнее, там есть агрегирующие массивы и слайсы …
  • ukroficer

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

    Spritz Фев. 27, 2013, 4:24 п.п., спустя 16 часов 8 минут 18 секунд

    Розюзал GROUP_CONCAT() классная вещь. Один минус то что нужно еще потом пройтись php по массиву, а так в целом то что нужно. Спасибо всем.

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