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

запрос

  • krasun

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

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

    books
    id | title | description | ,,,

    comments
    book_id | username | comment | …

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

  • adw0rd

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

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

    Через JOIN
    adw/0
  • krasun

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

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

  • Josh

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

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

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

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

    Spritz 26 января 2009 г. 8: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 г. 8:03, спустя 2 минуты 13 секунд


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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



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

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