
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.235.147.50] |
![]() |
|
![]() | Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Есть таблица со Сделками и таблица со статусами сделок.
Дамп: https://yadi.sk/d/IMlYc7xiPsvaRg Стоит задача вывести все Сделки в статусе 'Договор'. Отправляю запрос ![]() ![]() 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-запроса нормально форматировать, либо пользоваться онлайн-форматером, например этим. |
Сообщ.
#2
,
|
|
|
Цитата rownong@yandex.ru @ Это через SQL решается или нужно этот момент череp PHP решать? Не нужно делать через PHP то, что можно сделать запросом. Попробуй вот так: ![]() ![]() 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 Посмотри мою памятку на всякий случай, и убедись, то ли объединение ты хочешь получить. |
Сообщ.
#3
,
|
|
|
rownong@yandex.ru, а ты сам-то дамп смотрел? Там все четко и ясно - и почему "1007" не выбирается, и почему "1010" дублируется. Чтобы понять причину проблем, совсем необязательно знать основы реляционной алгебры и SQL, достаточно просто прочитать и сравнить несколько коротких строчек в небольшом текстовом файле.
|
![]() |
Сообщ.
#4
,
|
|
Хотел помочь, но не смог, не видно картинок. Картинок не видел потому, что надо куда-то регится, чтобы их увидеть.
Зачем это мне? |
Сообщ.
#5
,
|
|
|
Цитата AVA12 @ Чтобы понять причину проблем, совсем необязательно знать основы реляционной алгебры и SQL, Неужели, для идентификатора тип строка? Дубль потому что для 1010 две записи в статусе Договор А идентификатор действительно строка. Что есть плохо. 1007 не равно '1007\r\n' |
Сообщ.
#6
,
|
|
|
MIF, это ж обычный яндекс-диск, какая еще регистрация?
|
Сообщ.
#7
,
|
|
|
Цитата Павел Калугин @ 1) Дубль потому что для 1010 две записи в статусе Договор 2) А идентификатор действительно строка. Что есть плохо. 1007 не равно '1007\r\n' Павел, сорь, ты кросава. Я просто выделил важное, чтобы было виднее вопрошающему. |
Сообщ.
#8
,
|
|
|
Цитата JoeUser @ Цитата rownong@yandex.ru @ Это через SQL решается или нужно этот момент череp PHP решать? Не нужно делать через PHP то, что можно сделать запросом. Попробуй вот так: ![]() ![]() 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' Так у всех де идентификаторов тип строка, а не в разнобой. Или если сменить тип идентификаторов на цифровой то будет работать корректно? |
Сообщ.
#9
,
|
|
|
rownong@yandex.ru ну ты злодей!
![]() Давай так, ты почитаешь ООООЧЕНЬ внимательно, что тебе написали форумчане выше. Еще раз попытаешься осознать. И только после этого, если только не получиться - почитаешь под спойлером. Если сразу полезешь под сполйлер - ты неасилятор 80 lvl. Скрытый текст Как тебе уже подсказали выше - у тебя некорректные данные в таблицах. Смотри сам ... Вот тут у тебя некорректный идентификатор сделки. Мало того что ты его умудрился сделать строкой, а не числом, так ты еще и добавил к нему управляющие символы "перевод строки" и "возврат каретки". Срочно делай числовые данные - числовыми, а не строкой. Ну или убирай управляющие символы. Но главный модератор этого раздела тебя проклянет, если не переведешь поле в числовой формат. ![]() А вот тут у тебя дубль в данных. И ты спрашиваешь "в чем ошибся я?". Так вот клюв от воробья! Правь дубли в таблице: ![]() С туркменского перевожу - для одной сделки не делают два договора. |
Сообщ.
#10
,
|
|
|
Цитата rownong@yandex.ru @ Или если сменить тип идентификаторов на цифровой то будет работать корректно? ну для начала ты поймаешь стопку ошибок вставки данных на твоих "скриптах", а потом да, 1007 найдется. И еще подумай про уникальные индексы. |
Сообщ.
#11
,
|
|
|
JoeUser
Не применяйте ко мне все ваши измывательства. Или пожалуйста пишите по делу или не отвечайте. По '1007\r\n' понятно. Цитата А вот тут у тебя дубль в данных. Вы бы сначала разобрались. Там и задуман дубль данных. Это не договор, а Статус Договор назначенный в разное время у Сделки. Мне нужно чтобы выборка срабатывала в первой таблице без дублей во второй (уникальные Сделки со статусом Договор). Как это сделать? |
![]() |
Сообщ.
#12
,
|
|
Цитата rownong@yandex.ru @ без дублей во второй (уникальные Сделки со статусом Договор). Тыкнутые товарищем JoeUser во втором скриншоте записи - обе относятся к ОДНОЙ И ТОЙ ЖЕ сделке, и при этом обе они - с ОДНИМ И ТЕМ ЖЕ статусом "Договор". Так что прежде чем рекомендовать другим разбираться, неплохо бы сделать это тебе самому. Цитата rownong@yandex.ru @ Как это сделать? Сформулировать критерий, согласно которому из имеющихся дублей будет выбрана только одна запись. Причём всегда одна и та же... |
Сообщ.
#13
,
|
|
|
Цитата rownong@yandex.ru @ Вы бы сначала разобрались. Там и задуман дубль данных. Это не договор, а Статус Договор назначенный в разное время у Сделки. Мне нужно чтобы выборка срабатывала в первой таблице без дублей во второй (уникальные Сделки со статусом Договор). Как это сделать? Увы, сначала разбираться придётся вам. В запросе вы выбираете все записи где ид сделки 1010 и статус договор. Таких статусов два. Именно поэтому и записей запрос возвращает две. Что спрашиваете ровно то и получаете. Или надо уточнять условия отбора, или мириться с дублями. Ну и мой стандартный совет - учите теорию. |
Сообщ.
#14
,
|
|
|
Цитата rownong@yandex.ru @ JoeUser Не применяйте ко мне все ваши измывательства. Или пожалуйста пишите по делу или не отвечайте. Договорились. Прошу прощения, если задело ![]() Цитата rownong@yandex.ru @ Мне нужно чтобы выборка срабатывала в первой таблице без дублей во второй (уникальные Сделки со статусом Договор). Как это сделать? Когда используется оператор JOIN (да и вообще - SELECT), мы забываем про таблицы и говорим о результате выборки. Дубли выводятся, как уже расписали выше, потому как не определено условие, что оставлять, а что пропускать из дублей. В твоем случае дублей можно только ориентироваться на поле с временным штампом. Допустим выбирать запись последнюю по времени. И еще. Судя по таблице `status-contracts-amocrm`- записи в нее только добавляются. Можно было бы в таблице использовать для поля id атрибут AUTO_INCREMENT, а уже в запросе выбирать последнюю запись по максимальному значению id (куча вариантов как это сделать). |