За последние 24 часа нас посетили 20436 программистов и 1110 роботов. Сейчас ищут 399 программистов ...

Запрос на выборку из БД! ХЭЛПУЙТЕ!

Тема в разделе "PHP и базы данных", создана пользователем kretsman, 28 дек 2018.

Метки:
  1. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    Допустим имеем таблицу в БД Access:
    1.JPG

    Как из неё вычленить и вывести вот такое:
    2.JPG
    При этом оборудование которое выдано не должно учитываться.
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @kretsman, есть хоть какие-то свои мысли по этому поводу?
     
  3. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    я попробовал реализовать через чистый запрос и выглядит это кодом так:
    Код (Text):
    1. <?php
    2. $num = 0;
    3. $connect = odbc_connect("wobdv120", "", "");
    4. $q = "SELECT RecPart as `Тип оборудования`, (sum(LocCur = 'ready')+sum(LocCur = 'stock')+sum(LocCur = 'scrap')) as Всего,
    5. sum(LocCur = 'ready') as Готовое, sum(LocCur = 'stock') as `Ремонтный фонд`, sum(LocCur = 'scrap') as `Всего отдефектовано`
    6. FROM DataWO  WHERE PceType=61 GROUP BY RecPart";
    7. $result = odbc_prepare($connect,$q);
    8.  
    9. // Выполнить запрос и вывести результаты
    10. odbc_execute($result);
    11. odbc_result_all($result, "BGCOLOR='#E0ECF8' border=1");
    12.  
    13. // Закрыть соединение
    14. odbc_close($connect);
    15. echo $q;
    16. ?>
    Но результат совершенно удивительный:
    upload_2018-12-28_11-27-36.png

    Почему выглядит так совершенно непонятно))) Рысканье по разным материалам не помогло исправить ситуацию. Более того, не исключаются позиции которые не входят в критерий и не получается добавить дополнительные условия по выборке при учете других критериев.
     
    #3 kretsman, 28 дек 2018
    Последнее редактирование: 28 дек 2018
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @kretsman, ну хотя бы понимаешь, что нужна группировка. Ок чуть позже гляну что к чему.
     
  5. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    до конца не вник, но возможно стоит использовать count() вместо sum().

    у тебя же чисел нет в базе, что они там суммируют функцией sum() ?
     
  6. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    суммируется наличие такой строки, каунтом не считает, пробовал.
    Причем суммируется то правильно, только вот почему то отрицательное число выдает и со знаком после запятой.
    И опять же повторюсь, не получается исключить данные с нулями. Чтобы прост оен выводилась эта строка если такое оборудование не имеет строк с необходимыми состояниями. Он выводит и прост опишет нули
    --- Добавлено ---
    при использовании каунта выдает вот это, то есть почему то есть считает просто общее количество строк группируемых по критериям без разбиения на состояния оборудования))):
    upload_2018-12-28_12-25-11.png
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @kretsman, вот тебе пища для размышления:
    Код (Text):
    1.  
    2. SELECT `RecPart`, COUNT(*) AS `total`, `s`.`scrap`
    3.     FROM `DataWO`
    4.       LEFT JOIN (SELECT `RecPart`, COUNT(*) AS `scrap`
    5.                     FROM `DataWO`
    6.                     WHERE `LocCur` = 'брак'
    7.                     GROUP BY `RecPart`) AS `s` USING(`RecPart`)
    8.     WHERE `LocCur` <> 'выдан'
    9.     GROUP BY `RecPart`
    10.     ORDER BY `RecPart`
    Сможешь добавить остальные поля по аналогии?
     
  8. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    Осталось только понять что вы подразумеваете под "`s`.`scrap`"
    --- Добавлено ---
    к сож
    к сожалению до меня не дошла логика того что вы прислали, я не понял что значит `s`.`scrap` и дальнейшая ваша логика мне так и не поддалась
     
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    А чего там подразумевать, я даже объявление алиасов (AS) не опускал. `scrap` - это поле брак из таблицы `s`, которая формируется в результате вложенного запроса и присоединяется к основной таблице. Грубо говоря сколько колонок хотите получить, столько и соединений (LEFT JOIN) надо использовать.
    --- Добавлено ---
    это не моя логика :) это основы SQL
     
  10. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    к сож
    к сожалению до меня не дошла логика
    --- Добавлено ---
    Проблема в том что я вбил ваше, даже названия столбцов проставил и все равно не работает, ругается запрос, не выполняется. попробовал с одним столбцом, не работает
    --- Добавлено ---
    приведите конкретный пример исходя из того вопроса который я задал в начале, я спецаильн оег оупростил чтобы понять лоегче ответ. а тут выходит я ваш код не понимаю, я не понимаю как его изменить под свою таблику, вы scrap у меня это состояние "брак" а не наименование столбца. Я же нормальный пример дал изначально.

    есть столбец LocCur в котором есть значения "scrap", "shipped", "ready", "stock"
     
  11. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    я это вижу, теперь вам надо понять, что из столбца LocCur для того что бы реализовать логику необходимо сделать столько виртуальных таблиц сколько полей вы хотите получить. Открою маленький секрет, результат любого запроса - это таблица. И нам ничто не мешает в конструкции FROM использовать не название настоящей таблицы, а подзапрос
    Код (Text):
    1. SELECT `RecPart`, COUNT(*) AS `scrap`
    2.                     FROM `DataWO`
    3.                     WHERE `LocCur` = 'брак'
    4.                     GROUP BY `RecPart`
    , правда, что бы бд не ругалась надо использовать алиас, и обозвать эту нашу виртуальную таблицу.
    Код (Text):
    1. AS `s`
    Скажу честно с ACCESS я сталкивался очень давно и то мимоходом.
    С джоинами оно нормально дружит https://support.office.com/ru-ru/article/Операции-left-join-right-join-ebb18b36-7976-4c6e-9ea1-c701e9f7f5fb
    может USING не понимает, тогда взамест него ON `DataWO`.`RecPart` = `s`.`RecPart` надо
     
    #11 Valick, 28 дек 2018
    Последнее редактирование: 28 дек 2018
  12. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    Я ничего не понял исходя из связки первого вашего предложенного ответа и второго.
    Проверьте, вы точно не допустили ошибок в первом вашем ответе?
    Просто одно с другим не бьется как то
    --- Добавлено ---
    Вы такого наворотили в ответах, везде разное, не понятно совсем ничего. Я прошу вас примените свою логику к тому конкретному примеру который я в самом первом посте оставило, на нем я пойму. А тут какая-то билиберда получается
     
  13. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    я то точно не допустил ошибок, просто запрос надо подкорректировать под ваши реальные таблицы, а мой запрос для вашей упрощённой таблицы из первого сообщения.
     
  14. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    в моем первом примере два столбца, прибор и состояние.
    Вы же написали и RecPart и скрэп...
     
  15. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    да, а еще там нет названия таблицы? это не смущает? что трудного в моём ответе заменить RecPart на `прибор`, а LocCur на `состояние`?
     
  16. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    Что означает в вашем ответе это? 3.JPG
    --- Добавлено ---
    Код (Text):
    1. SELECT `RecPart`, COUNT(LocCur) AS `total`, `s`.`scrap`
    2.     FROM `DataWO`
    3.       LEFT JOIN (SELECT `RecPart`, COUNT(LocCur) AS `scrap`
    4.                     FROM `DataWO`
    5.                     WHERE `LocCur` = 'scrap'
    6.                     GROUP BY `RecPart`) AS `s` USING(`RecPart`)
    7.    WHERE PceType=61 and LocCur <> 'shipped' GROUP BY RecPart
    Вот запрос по вашему мотиву и вот какая ошибка выдается:
    Warning: odbc_prepare() [function.odbc-prepare]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Ошибка синтаксиса в предложении FROM., SQL state 37000 in SQLPrepare inZ:\home\lepus\www\invneo.php on line 15

    Warning: odbc_execute(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 18

    Warning: odbc_result_all(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 19
     
  17. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    `s` - это алиас виртуальной таблицы которая формируется в результате вложенного запроса
    SELECT `RecPart`, COUNT(*) AS `scrap`
    FROM `DataWO
    WHERE `LocCur` = 'брак'
    GROUP BY `RecPart`) AS `s`
    `scrap` - это поле алиас количества COUNT(*) AS `scrap` из всё того же вложенного запроса
    Может вот так будет понятнее:
    Код (Text):
    1. SELECT `прибор`, COUNT(*) AS `общее количество`, `виртуальная таблица брака`.`виртуальное поле количества брака`
    2.     FROM `DataWO`
    3.       LEFT JOIN (SELECT `прибор`, COUNT(*) AS `виртуальное поле количества брака`
    4.                     FROM `DataWO`
    5.                     WHERE `состояние` = 'брак'
    6.                     GROUP BY `прибор`) AS `виртуальная таблица брака` ON `DataWO`.`прибор` = `виртуальная таблица брака`.`прибор`
    7.     WHERE `состояние` <> 'выдан'
    8.     GROUP BY `прибор`
    9.     ORDER BY `прибор`
    --- Добавлено ---
    я же написал может access не понимает USING и написал чем его заменить, попробуй вот этот последний запрос, вместо `DataWO` подставь имя своей таблицы из первого сообщения

    P.S. Я так понимаю соединения JOIN ты видишь первый раз в жизни?
     
  18. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    вижу не первый раз в жизни, правда им до этог оне пользовался.
    Замена USING на ON не изменила ничего, ошибки выдает те же
     
  19. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    покажи свой запрос сделай копипаст и кинь сюда
     
  20. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    $q = "SELECT `RecPart`, COUNT(LocCur) AS `total`, `s`.`scrap`
    FROM `DataWO`
    LEFT JOIN (SELECT `RecPart`, COUNT(LocCur) AS `scrap`
    FROM `DataWO`
    WHERE `LocCur` = 'scrap'
    GROUP BY `RecPart`) AS `s` on `RecPart`
    WHERE PceType=61 and LocCur <> 'shipped' GROUP BY RecPart";

    Выдаваемые ошибки:
    Warning: odbc_prepare() [function.odbc-prepare]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Не поддерживается выражение объединения., SQL state S1000 in SQLPrepare inZ:\home\lepus\www\invneo.php on line 15

    Warning: odbc_execute(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 18

    Warning: odbc_result_all(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 19
     
  21. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    $q = "SELECT `RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak`
    FROM `DataWO`
    LEFT JOIN (SELECT `RecPart`, COUNT(`LocCur`) AS `brak`
    FROM `DataWO`
    WHERE `LocCur` = 'scrap'
    GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`RecPart`
    WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`";

    Теперь сделай кописат отсюда
    И внимательнее читай ответы на свои вопросы, это в первую очередь надо тебе, а не мне.
     
  22. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    Выдало вот такую ошибку

    Warning: odbc_execute() [function.odbc-execute]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Ссылка на поле '`RecPart`' может относиться к полям нескольких таблиц, перечисленных в предложении FROM инструкции SQL., SQL state S1000 in SQLExecute in Z:\home\lepus\www\invneo.php on line 18
     
  23. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    вот тут GROUP BY `RecPart`) AS `s` перед AS поставь пробел на всякий случай, блин да у тебя они там везде без пробелов, тьфу, хотя нет вроде есть пробелы
    --- Добавлено ---
    $q = "SELECT `RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak`
    FROM `DataWO`
    LEFT JOIN (SELECT `RecPart` AS `r`, COUNT(`LocCur`) AS `brak`
    FROM `DataWO`
    WHERE `LocCur` = 'scrap'
    GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`r`
    WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`";

    попробуй вот так, тьфу нет вот так

    $q = "SELECT `DataWO`.`RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak`
    FROM `DataWO`
    LEFT JOIN (SELECT `RecPart` AS `r`, COUNT(`LocCur`) AS `brak`
    FROM `DataWO`
    WHERE `LocCur` = 'scrap'
    GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`r`
    WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`";
     
  24. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    Пробелы есть везде, но вот не арбайтен, простите что достаю вас, хочу нормально разобраться, чтобы понять что к чему.

    Теперь вот такую ошибку пишет:
    Warning: odbc_execute() [function.odbc-execute]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Попытка выполнить запрос, который не включает указанное выражение 'brak' как часть статистической функции или группы., SQL state 37000 in SQLExecute in Z:\home\lepus\www\invneo.php on line 18
     
  25. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    $q = "SELECT `DataWO`.`RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak`
    FROM `DataWO`
    LEFT JOIN (SELECT `RecPart` AS `r`, COUNT(`LocCur`) AS `brak`
    FROM `DataWO`
    WHERE `LocCur` = 'scrap'
    GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`r`
    WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`";

    я уже потихоньку ненавижу access, пробуй так