1. PHP / Говнокод #12091

    +54

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    $res = mysql_query("SELECT * FROM `users`");
    while ($arr = mysql_fetch_assoc($res))
    {
    	$res1 = mysql_query("SELECT * FROM `cabinet_users` WHERE `nick`='$arr[user]'");
    	$arr1 = mysql_fetch_assoc($res1);
            ...
    }

    JOIN'ы для слабаков.

    Запостил: UnnamedUser, 10 Ноября 2012

    Комментарии (43) RSS

    • Один мой знакомый, когда не знал джойнов, писал хранимые процедуры и каким-то хитрым образом с помощью циклов эмулировал их наличие. Так что на выдумки все хитры.
      Ответить
      • > не знал джойнов
        > писал хранимые процедуры
        Как-то он не с той стороны начал изучать SQL...

        Shame on me, но я до сих пор полный нуб в хранимках, хотя SQL знаю неплохо.
        Ответить
        • Там вся система построена на хранимках у него. Не могу сказать, почему он пришёл к такому выбору. Но продолжил использовать то, к чему привык, вместо того, что требуется. Такое тоже случается, довольно часто.
          Ответить
      • Вы так говорите, как будто джойны нужны:
        $res = mysql_query("SELECT * FROM `users`");
        	$ids = array();
        	while ($arr = mysql_fetch_assoc($res))
        	{
        	    $ids[] = $arr['id'];
        	}
        	$all_ids =implode(',', $ids);
        	$res = mysql_query("SELECT * FROM `cabinet_users` WHERE `id` IN ($all_ids)");
        	while ($arr = mysql_fetch_assoc($res))
        	{
                        ...
        	}
        Ответить
        • SELECT * FROM `cabinet_users` WHERE `id` IN (SELECT `id` FROM `users`)
          Ответить
          • Где здесь PHP, scriptin? Без него некрасиво.

            Да и потом, я же могу в первом цикле кроме сборки массива $ids собирать массив со всеми колонками, чтобы потом склеить его с массивом, полученным из второго цикла.

            А в этом примере как такую красоту собрать?
            Ответить
            • SELECT * FROM `cabinet_users`,`users` WHERE `cabinet_users`.`id`=`users`.`id`
              и никаких джойнов
              Ответить
              • Это всего лишь устаревшая версия синтаксиса для джойнов. Современные РСУБД для таких запросов и аналогичных им с явным JOIN даже одинаковые планы выполнения составляют.
                Ответить
                • не надо конкурировать со мной, кэп#2
                  Ответить
                • Кажется, ГК внезапно становится антихаброй: здесь минусуют конкурентов кэпа.
                  Ответить
                  • На корабле может быть только один капитан.
                    Ответить
                    • Капитаны третьего ранга негодуют.
                      Ответить
                      • К-н третьего ранга это не должность, а звание, аналог сухопутного "майор". Этих КТР может быть хоть мульон на корабле.
                        Ответить
                        • Спасибо, капитан третьего ранга очевидности.
                          Ответить
                  • Это наверное я минуснул, меня раздражают `волосатые` `артефакты` `в` `запросах` .
                    Ответить
                    • Тут кстати с самого начала топика `волосатые` `запросы`.
                      Ответить
                      • зато так можно обращаться к полю с именем, date, например.
                        Ответить
                        • Ну да. Это как this в джаве. Кто-то ставит всегда, кто-то только там где неоднозначно. И имхо оба варианта имеют право на жизнь.
                          Ответить
              • У нас в институте так на лабах по акцессу было. По непонятной мне причине, про джойны и потом не рассказывали, а вот неявный способ был единственным, который я знал на тот момент. К счастью, потом была интересная работа, инторнеты появились. А мог бы жить с психотравмой всю жизнь.
                Ответить
                • Ну кстати "благодаря" лабам я поначалу тоже пользовался перечислением через запятую и where. А о join узнал только когда мне понадобился outer join, и я не смог его выразить через where...
                  Ответить
                  • я тож поначалу терялся в жойнах и группах, но первая работа, с olap и хранимками, заставила меня в этом начать разбираться.
                    до сих пор недолюбливаю sql
                    Ответить
                    • ты просто не умеешь его готовить ;-)
                      Ответить
                  • > А о join узнал только когда мне понадобился outer join, и я не смог его выразить через where...
                    Это ведь сайт с говнокодом, да?
                    create table test1(id int,name varchar(10))
                    insert into test1 values (1, 'asd')
                    insert into test1 values (2, 'asaaaaa')
                    create table test2(id int,name varchar(10))
                    insert into test2 values (2, 'fffff')
                    insert into test2 values (2, 'uuuuuu')
                    insert into test2 values (3, 'cccccc')
                    insert into test2 values (3, 'kkkk')
                    
                    select * from test1 t1, test2 t2
                    where t1.id = t2.id
                    union all
                    select t1.*,null,null from test1 t1 where t1.id not in (select id from test2)
                    union all
                    select null,null,t2.* from test2 t2 where t2.id not in (select id from test1)
                    
                    drop table test1
                    drop table test2
                    Ответить
                    • О union я, к сожалению, узнал еще позднее, чем о join...

                      P.S. Но красиво, да ;)
                      P.P.S. С другой стороны хорошо, что я тогда не смог это написать, а все-таки занялся изучением доков по SQL...
                      Ответить
              • ужасный стиль написания запросов, неявный join всё равно присутствует. чаще читайте Фленова, да. привет любителям Delphi.
                Ответить
                • > всего лишь устаревшая версия синтаксиса для джойнов
                  > неявный join всё равно присутствует
                  Неужели теперь действительно нужно писать явно текст зелёным... Даже я разглядел тег sarcasm в комменте @Lure_Of_Chaos, набранный 72 полужирным шрифтом.
                  Ответить
                  • > Даже я разглядел тег sarcasm в комменте @Lure_Of_Chaos, набранный 72 полужирным шрифтом.
                    спасибо
                    Ответить
                  • В новой редакции закона о связи сказано: "публикующий статьи или сообщения в сети передачи данных "Интернет" обязан составлять их таким образом, чтобы они были доступны людям с ограниченными возможностями (к примеру отсутствующим чуством юмора)".
                    Ответить
                    • [Осторожно! Это сообщение может содержать шутку, недоступную определённым категориям лиц, страдающим некоторыми расстройствами] Показать всё, что скрыто
                      Ответить
        • Удачи тебе, попробуй это сделать на таблице хотя бы в пару тысяч пользователей, я думаю результат тебя удивит )
          Ответить
          • Вангую сломанный детектор иронии!
            Ответить
          • Сделал на таблице over 10 000 пользователей. У меня всё работает. На всё 600 миллисекунд. Чему я должен был удивиться?
            Ответить
            • Странно просто у меня как-то была проблема то что пых у меня ругался на слишком длинный запрос, когда я что-то подобное пытался сделать, конкретно про строки
              $all_ids =implode(',', $ids);
              $res = mysql_query("SELECT * FROM `cabinet_users` WHERE `id` IN ($all_ids)");

              Может я что-то путаю, надо будет дома проверить
              Ответить
              • max_allowed_packet сколько стоит?
                Ответить
              • Разницу между:
                SELECT * FROM table1 WHERE id IN (<ids_list>)
                и
                SELECT * FROM table1 WHERE id IN (<subquery from table2>)
                улавливаете?
                В первом случае оптимизатор запросов сделает: WHERE id = <1st value> OR id = <2nd value> OR...
                Во втором случае: table1 INNER JOIN table2 ON table1.id = table2.id

                Да и вообще, у Вас ошибка на уровне пыха вылетает, а не СУБД.
                Ответить
                • Я то улавливаю, а вот вы по-моему мой комментарий не внимательно прочитали. Я написал что в случае если все id через запятую конкатенировать и в запрос поставить, то в случае если их много, то запрос получался слишком длинный и пых ругался.
                  Просто inkanus-gray, привел кусок кода и написал "Вы так говорите, как будто джойны нужны:". Я и поделился опытом, про слишком длинный запрос. Там правда данные не из базы брались, а приходил массив id от пользователя, на основе которого формировался запрос.
                  Ответить
                  • > то запрос получался слишком длинный и пых ругался
                    Потестил на mysql - 100000 работает, 1000000 падает с ошибкой "превышен максимальный размер пакета" (тот самый max_allowed_packet, который у меня мегабайт). Так что ругается именно СУБД или либа для доступа к ней, но не сам пых.
                    Ответить
                    • Ваша правда, я прогнал. Дело было не на пыхе, дело было на перле.
                      Ответить
                    • Но и там скорее всего проблема либо в драйверах либо в самой базе была. Точно помню что число айдишников, которые подставлялись в условие, не десятки тысяч было и даже не тысячи, но гораздо меньше, в пределах сотни может двух
                      Ответить
                      • Ну возможно этот самый max_allowed_packet поменьше стоял, или это был четвертый мускуль. В нем вроде бы были ограничения пожестче.
                        Ответить
          • Есть у нас тут одна базочка, в которую каждые 15 минут заливается пакет из 20-30к записей...

            Вот на ней можно было бы ставить такие эксперименты, а со сраными 2к любой говнокод справится.
            Ответить

    Добавить комментарий