На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Не верно срабатывает выборка из базы данных
    Есть таблица со Сделками и таблица со статусами сделок.
    Дамп: https://yadi.sk/d/IMlYc7xiPsvaRg

    Стоит задача вывести все Сделки в статусе 'Договор'.

    Отправляю запрос

    ExpandedWrap disabled
      SELECT *
      FROM `sdelki-amocrm`
      INNER JOIN `status-contracts-amocrm` ON `sdelki-amocrm`.`id-sdelki` = `status-contracts-amocrm`.`id-sdelki`
      AND `status-contracts-amocrm`.`status-sdelki`= 'Договор'

    Проблемы:
    1. Выбираются не все Сделки. Например нет Сделки 1007, хотя ее статус есть в таблице https://yadi.sk/i/OvLK9p4TdFmoXw
    2. Идут дубли Сделок https://yadi.sk/i/Ny1g8KGgyFgVdQ хотя нужны уникальные Сделки. Это через SQL решается или нужно этот момент череp PHP решать?

    M

    Просьба SQL обрамлять тегами CODE
    А сам текст SQL-запроса нормально форматировать, либо пользоваться онлайн-форматером, например этим.
    Сообщение отредактировано: JoeUser -
      Цитата rownong@yandex.ru @
      Это через SQL решается или нужно этот момент череp PHP решать?

      Не нужно делать через PHP то, что можно сделать запросом. Попробуй вот так:
      ExpandedWrap disabled
        SELECT *
        FROM `sdelki-amocrm`
        INNER JOIN `status-contracts-amocrm` ON `sdelki-amocrm`.`id-sdelki` = `status-contracts-amocrm`.`id-sdelki`
        WHERE `status-contracts-amocrm`.`status-sdelki`= 'Договор'

      Я не смотрел сами таблицы. Но по логике ты их сперва клеишь по id-sdelki, потом фильтруешь по status-sdelki
      Посмотри мою памятку на всякий случай, и убедись, то ли объединение ты хочешь получить.
        rownong@yandex.ru, а ты сам-то дамп смотрел? Там все четко и ясно - и почему "1007" не выбирается, и почему "1010" дублируется. Чтобы понять причину проблем, совсем необязательно знать основы реляционной алгебры и SQL, достаточно просто прочитать и сравнить несколько коротких строчек в небольшом текстовом файле.
          Хотел помочь, но не смог, не видно картинок. Картинок не видел потому, что надо куда-то регится, чтобы их увидеть.
          Зачем это мне?
            Цитата AVA12 @
            Чтобы понять причину проблем, совсем необязательно знать основы реляционной алгебры и SQL,

            Неужели, для идентификатора тип строка?

            Дубль потому что для 1010 две записи в статусе Договор

            А идентификатор действительно строка. Что есть плохо. 1007 не равно '1007\r\n'
            Сообщение отредактировано: Павел Калугин -
              MIF, это ж обычный яндекс-диск, какая еще регистрация?
                Цитата Павел Калугин @

                1) Дубль потому что для 1010 две записи в статусе Договор
                2) А идентификатор действительно строка. Что есть плохо. 1007 не равно '1007\r\n'

                Павел, сорь, ты кросава. Я просто выделил важное, чтобы было виднее вопрошающему.
                  Цитата JoeUser @
                  Цитата rownong@yandex.ru @
                  Это через SQL решается или нужно этот момент череp PHP решать?

                  Не нужно делать через PHP то, что можно сделать запросом. Попробуй вот так:
                  ExpandedWrap disabled
                    SELECT *
                    FROM `sdelki-amocrm`
                    INNER JOIN `status-contracts-amocrm` ON `sdelki-amocrm`.`id-sdelki` = `status-contracts-amocrm`.`id-sdelki`
                    WHERE `status-contracts-amocrm`.`status-sdelki`= 'Договор'

                  Я не смотрел сами таблицы. Но по логике ты их сперва клеишь по id-sdelki, потом фильтруешь по status-sdelki
                  Посмотри мою памятку на всякий случай, и убедись, то ли объединение ты хочешь получить.

                  Пробовал, результат тот же самый.

                  Добавлено
                  Цитата
                  rownong@yandex.ru, а ты сам-то дамп смотрел? Там все четко и ясно - и почему "1007" не выбирается, и почему "1010" дублируется. Чтобы понять причину проблем, совсем необязательно знать основы реляционной алгебры и SQL, достаточно просто прочитать и сравнить несколько коротких строчек в небольшом текстовом файле.


                  Смотрел все равно не пойму почему "1007" не выбирается, и почему "1010" дублируется. Напишите пожалуйста.

                  Добавлено
                  Цитата
                  Цитата AVA12 @
                  Чтобы понять причину проблем, совсем необязательно знать основы реляционной алгебры и SQL,

                  Неужели, для идентификатора тип строка?

                  Дубль потому что для 1010 две записи в статусе Договор

                  А идентификатор действительно строка. Что есть плохо. 1007 не равно '1007\r\n'


                  Так у всех де идентификаторов тип строка, а не в разнобой.
                  Или если сменить тип идентификаторов на цифровой то будет работать корректно?
                  Сообщение отредактировано: rownong@yandex.ru -
                    rownong@yandex.ru ну ты злодей! :lol:

                    Давай так, ты почитаешь ООООЧЕНЬ внимательно, что тебе написали форумчане выше. Еще раз попытаешься осознать. И только после этого, если только не получиться - почитаешь под спойлером. Если сразу полезешь под сполйлер - ты неасилятор 80 lvl.

                    Скрытый текст
                    Как тебе уже подсказали выше - у тебя некорректные данные в таблицах.

                    Смотри сам ...

                    Вот тут у тебя некорректный идентификатор сделки. Мало того что ты его умудрился сделать строкой, а не числом, так ты еще и добавил к нему управляющие символы "перевод строки" и "возврат каретки". Срочно делай числовые данные - числовыми, а не строкой. Ну или убирай управляющие символы. Но главный модератор этого раздела тебя проклянет, если не переведешь поле в числовой формат.

                    user posted image

                    А вот тут у тебя дубль в данных. И ты спрашиваешь "в чем ошибся я?". Так вот клюв от воробья! Правь дубли в таблице:

                    user posted image

                    С туркменского перевожу - для одной сделки не делают два договора.

                      Цитата rownong@yandex.ru @
                      Или если сменить тип идентификаторов на цифровой то будет работать корректно?

                      ну для начала ты поймаешь стопку ошибок вставки данных на твоих "скриптах", а потом да, 1007 найдется.

                      И еще подумай про уникальные индексы.
                        JoeUser
                        Не применяйте ко мне все ваши измывательства.
                        Или пожалуйста пишите по делу или не отвечайте.

                        По '1007\r\n' понятно.

                        Цитата
                        А вот тут у тебя дубль в данных.

                        Вы бы сначала разобрались.
                        Там и задуман дубль данных. Это не договор, а Статус Договор назначенный в разное время у Сделки.
                        Мне нужно чтобы выборка срабатывала в первой таблице без дублей во второй (уникальные Сделки со статусом Договор). Как это сделать?
                          Цитата rownong@yandex.ru @
                          без дублей во второй (уникальные Сделки со статусом Договор).

                          Тыкнутые товарищем JoeUser во втором скриншоте записи - обе относятся к ОДНОЙ И ТОЙ ЖЕ сделке, и при этом обе они - с ОДНИМ И ТЕМ ЖЕ статусом "Договор". Так что прежде чем рекомендовать другим разбираться, неплохо бы сделать это тебе самому.

                          Цитата rownong@yandex.ru @
                          Как это сделать?

                          Сформулировать критерий, согласно которому из имеющихся дублей будет выбрана только одна запись. Причём всегда одна и та же...
                            Цитата rownong@yandex.ru @
                            Вы бы сначала разобрались.
                            Там и задуман дубль данных. Это не договор, а Статус Договор назначенный в разное время у Сделки.
                            Мне нужно чтобы выборка срабатывала в первой таблице без дублей во второй (уникальные Сделки со статусом Договор). Как это сделать?

                            Увы, сначала разбираться придётся вам. В запросе вы выбираете все записи где ид сделки 1010 и статус договор. Таких статусов два. Именно поэтому и записей запрос возвращает две. Что спрашиваете ровно то и получаете.

                            Или надо уточнять условия отбора, или мириться с дублями.

                            Ну и мой стандартный совет - учите теорию.
                              Цитата rownong@yandex.ru @
                              JoeUser
                              Не применяйте ко мне все ваши измывательства.
                              Или пожалуйста пишите по делу или не отвечайте.

                              Договорились. Прошу прощения, если задело :)

                              Цитата rownong@yandex.ru @
                              Мне нужно чтобы выборка срабатывала в первой таблице без дублей во второй (уникальные Сделки со статусом Договор). Как это сделать?

                              Когда используется оператор JOIN (да и вообще - SELECT), мы забываем про таблицы и говорим о результате выборки. Дубли выводятся, как уже расписали выше, потому как не определено условие, что оставлять, а что пропускать из дублей. В твоем случае дублей можно только ориентироваться на поле с временным штампом. Допустим выбирать запись последнюю по времени. И еще. Судя по таблице `status-contracts-amocrm`- записи в нее только добавляются. Можно было бы в таблице использовать для поля id атрибут AUTO_INCREMENT, а уже в запросе выбирать последнюю запись по максимальному значению id (куча вариантов как это сделать).
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0401 ]   [ 15 queries used ]   [ Generated: 19.04.24, 22:37 GMT ]