ФорумРазработкаБазы данных → запрос

запрос

  • krasun

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

    Spritz 23 января 2009 г. 23:11

    books
    id | title | description | ,,,

    comments
    book_id | username | comment | …

    Нужно получить все книги с таблицы books и количество комментариев к каждой книге count(), как это сделать одним запросом?

  • adw0rd

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

    Spritz 23 января 2009 г. 23:26, спустя 15 минут 47 секунд

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

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

    Spritz 23 января 2009 г. 23:31, спустя 4 минуты 10 секунд

  • Josh

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

    Spritz 26 января 2009 г. 15:12, спустя 2 дня 15 часов 41 минуту

    Вообще можно и вьюшкой если InnoDB и часто запрос юзаеться:)
  • SaM1001

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

    Spritz 26 января 2009 г. 16:01, спустя 49 минут 17 секунд

    Я последний раз через UNION собрал такую функцию, пол дня убил на неё:-)

    
    $sql = "
                            SELECT SO.ID AS SOID, SO.LimitDate,
                            REPLACE(CAST(SO.Description AS varchar(max)),'', char(13)) AS SODescription, CK.I3D,
                            CONVERT(varchar(5), OGP.Start, 108) AS Start, CONVERT(varchar(5), OGP.Ende, 108) AS Ende,
                            Left(CONVERT(int, DATEDIFF(mi, OGP.Start, OGP.Ende))/10, NULL) AS LE, CONVERT(varchar, OGP.Start, 104) AS Datum,
                            OWT.ID AS OWTID, OWT.I3DAgent AS IDAgent, OWT.Agent AS OWTAgent,
                            OGP.ID AS OGPID, OGP.Erledigt, REPLACE(CAST(OGP.Description AS varchar(max)),'', char(13)) AS OGPDescription,
                            Str(FP.Price*OGP.Quantity, 10, 2) AS Betrag,
                            SB1.I3D AS TechID, CPS.Vorname +' ' + CPS.Name AS Technikername, OJK.Code, OJK.ID,
                            OGP.Quantity AS Anzahl, Str(FP.Price, 10, 2) AS Price,
                            FP.Description AS FPDescription, FP.TimeTotal, FP.Code AS PCode,
                            CPS.KurzZeich AS KurzName, WA.Username, WA.TypeI3D
                            FROM "                  . DBSAM .       "Orders         SO
                            LEFT OUTER JOIN "       . DBCENTRON .   "Kunden         CK      ON      SO.I3DKunde     = CK.I3D
                            LEFT OUTER JOIN "       . DBCENTRON .   "Sichbenu       SB      ON      SO.I3DAgent     = SB.I3D
                            LEFT OUTER JOIN "       . DBCENTRON .   "Personal       CPal    ON      SB.Personal     = CPal.I3D
                            INNER JOIN "            . DBSAM     .   "OrderWorkingTimes OWT  ON      SO.ID           = OWT.IDOrder
                            LEFT OUTER JOIN "       . DBCENTRON .   "Sichbenu       SB1     ON      OWT.I3DAgent    = SB1.Personal
                            LEFT OUTER JOIN "       . DBCENTRON .   "Personal       CPS     ON      OWT.I3DAgent    = CPS.I3D
                            LEFT OUTER JOIN "       . DBCENTRON .   "WebAccounts    WA      ON      CPS.I3D         = WA.TypeI3D
                            RIGHT OUTER JOIN "      . DBSAM .       "OrderGlobalPayments OGP ON     OWT.ID          = OGP.IDWorkingTime
                            INNER JOIN "            . DBSAM .       "FixedPayments  FP      ON      OGP.IDGlobalPayment = FP.ID
                            INNER JOIN "            . DBSAM .       "OrderJobKinds  OJK     ON      OGP.IDJobKind   = OJK.ID
                            WHERE SO.Deleted = 0 AND SO.ID = " . $this->mdb2->quote($OrderID, 'integer') .
                            " AND OJK.ID=1 AND OWT.Deleted=0 AND OGP.Deleted=0
    
                            UNION ALL
    
                            SELECT SO2.ID AS SOID, SO2.LimitDate,
                            REPLACE(CAST(SO2.Description AS varchar(max)),'', char(13)) AS SODescription, CK2.I3D,
                            CONVERT(varchar(5), OGP2.Start, 108) AS Start, CONVERT(varchar(5), OGP2.Ende, 108) AS Ende,
                            CONVERT(int, DATEDIFF(mi, OGP2.Start, OGP2.Ende))/10 AS LE, CONVERT(varchar, OGP2.Start, 104) AS Datum,
                            OWT2.ID AS OWTID, OWT2.I3DAgent AS IDAgent, OWT2.Agent AS OWTAgent, OGP2.ID AS OGPID, OGP2.Erledigt,
                            REPLACE(CAST(OGP2.Description AS varchar(max)),'', char(13)) AS OGPDescription,
                            Str((CONVERT(float, DATEDIFF(mi, OGP2.Start, OGP2.Ende)))*(VP2.Price)/10, 10, 2) AS Betrag,
                            SB12.I3D AS TechID, CPS2.Vorname +' ' + CPS2.Name AS Technikername,
                            OJK2.Code, OJK2.ID, Left(OGP2.Quantity, NULL) AS Anzahl, Str(VP2.Price, 10, 2) AS Price, VP2.Description AS FPDescription, VP2.TimeTotal, VP2.Code AS PCode,
                            CPS2.KurzZeich AS KurzName, WA1.Username, WA1.TypeI3D
                            FROM "                  . DBSAM .       "Orders         SO2
                            LEFT OUTER JOIN "       . DBCENTRON .   "Kunden         CK2     ON      SO2.I3DKunde    = CK2.I3D
                            LEFT OUTER JOIN "       . DBCENTRON .   "Sichbenu       SB2     ON      SO2.I3DAgent    = SB2.I3D
                            LEFT OUTER JOIN "       . DBCENTRON .   "Personal       CPal2   ON      SB2.Personal    = CPal2.I3D
                            LEFT OUTER JOIN "       . DBSAM     .   "OrderWorkingTimes OWT2 ON      SO2.ID          = OWT2.IDOrder
                            LEFT OUTER JOIN "       . DBCENTRON .   "Sichbenu       SB12    ON      OWT2.I3DAgent   = SB12.Personal
                            LEFT OUTER JOIN "       . DBCENTRON .   "Personal       CPS2    ON      OWT2.I3DAgent   = CPS2.I3D
                            LEFT OUTER JOIN "       . DBCENTRON .   "WebAccounts    WA1     ON      CPal2.I3D       = WA1.TypeI3D
                            RIGHT OUTER JOIN "      . DBSAM     .   "OrderGlobalPayments OGP2 ON    OWT2.ID         = OGP2.IDWorkingTime
                            INNER JOIN "            . DBSAM .       "VariablePayments VP2   ON      OGP2.IDGlobalPayment = VP2.ID
                            INNER JOIN "            . DBSAM .       "OrderJobKinds  OJK2    ON      OGP2.IDJobKind  = OJK2.ID
                            WHERE SO2.Deleted = 0 AND SO2.ID = " . $this->mdb2->quote($OrderID, 'integer') . " AND OJK2.ID=2 AND OWT2.Deleted=0 AND OGP2.Deleted=0" .
                            "ORDER BY Datum;";
    
                    $res =& $this->mdb2->query($sql);
            //Überprüfe ob es zu Fehlern kam
    
                    if (PEAR::isError($res))
                    {
                    die($res->getMessage());
                    }
    //              $row = $res->fetchRow();
                    while($row = $res->fetchRow())
                    {
                            $OrderPrint[] = $row;
                    }
    
                    return $OrderPrint;
        }
    
  • Josh

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

    Spritz 26 января 2009 г. 16:03, спустя 2 минуты 13 секунд


    Я последний раз через UNION собрал такую функцию, пол дня убил на неё:-)
    Впринципе мнений куча - можна и вложеным запросом, но тогда ключики надо поставить
  • SaM1001

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

    Spritz 26 января 2009 г. 16:05, спустя 1 минуту 37 секунд

    Кому как удобней, в том случае по другому никак не получалось
  • md5

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

    Spritz 26 января 2009 г. 16:13, спустя 8 минут 1 секунду

    мне запрос не понравился
    все умрут, а я изумруд
  • SaM1001

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

    Spritz 26 января 2009 г. 16:14, спустя 1 минуту 42 секунды

    Мне тоже, а делать что-то надо было:-)
  • phpdude

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

    Spritz 26 января 2009 г. 16:55, спустя 40 минут 42 секунды

    а потом задают вопросы в сапорт: почему у меня вместо результата запроса возвращается "Mysql server has gone away!" ??
    Сапожник без сапог
  • Josh

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

    Spritz 26 января 2009 г. 17:51, спустя 55 минут 31 секунду


    а потом задают вопросы в сапорт: почему у меня вместо результата запроса возвращается "Mysql server has gone away!" ??
    Ну да - если глупо заархитектурить базу
  • phpdude

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

    Spritz 26 января 2009 г. 17:57, спустя 6 минут

    сразу вспоминаю про битрикс … где в подсчете статы юзалось 34 таблицы ….. нормализация бд это хорошо, но моск то терять - это плохо )
    Сапожник без сапог
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 27 января 2009 г. 0:42, спустя 6 часов 45 минут 24 секунды

    Я вот сам с таких запросом, как у SaM1001 офигеваю. Ну понимаю, что это круто и прочее, но все равно никак не могу понять для чего они такие нужны там, где их можно заменить на два-три более простых и возможно в будущем более информативных запроса.
    Может потому что ещё зелен, а может потому что просто пока самому не доводилось делать что-то более-менее серезное.
    Но все равно считаю такие запросы не самым лучшим способом показать способности прогера :)
  • Josh

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

    Spritz 27 января 2009 г. 12:17, спустя 11 часов 34 минуты 55 секунд


    Я вот сам с таких запросом, как у SaM1001 офигеваю. Ну понимаю, что это круто и прочее, но все равно никак не могу понять для чего они такие нужны там, где их можно заменить на два-три более простых и возможно в будущем более информативных запроса.
    Может потому что ещё зелен, а может потому что просто пока самому не доводилось делать что-то более-менее серезное.
    Но все равно считаю такие запросы не самым лучшим способом показать способности прогера :)
    Не всегда просто разбить запрос на части, ещё скажи запхать в php массивчик, так полмилионный, сгрупировать его, обработать, так несколько раз, а потом ещё склеить. На мелких проектах да - там даже аплоады можна с темпов не удалять (стебусь)
  • phpdude

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

    Spritz 27 января 2009 г. 14:58, спустя 2 часа 40 минут 40 секунд



    Я вот сам с таких запросом, как у SaM1001 офигеваю. Ну понимаю, что это круто и прочее, но все равно никак не могу понять для чего они такие нужны там, где их можно заменить на два-три более простых и возможно в будущем более информативных запроса.
    Может потому что ещё зелен, а может потому что просто пока самому не доводилось делать что-то более-менее серезное.
    Но все равно считаю такие запросы не самым лучшим способом показать способности прогера :)
    Не всегда просто разбить запрос на части, ещё скажи запхать в php массивчик, так полмилионный, сгрупировать его, обработать, так несколько раз, а потом ещё склеить. На мелких проектах да - там даже аплоады можна с темпов не удалять (стебусь)
    аплоады сами удаляются. по завершению работы скрипта.
    не стебусь
    Сапожник без сапог

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