powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Простой или сложный запрос?
25 сообщений из 25, страница 1 из 1
Простой или сложный запрос?
    #38442238
Приветствую.
Никак не могу написать как кажется один простой запрос. Может он сложный, а я упрощаю?
Начну с дела. Есть две таблицы, одна таблица справочник, другая таблица наличие товара.
В справочнике содержится информация о товаре и он является главным при определении наименования у товара.
В таблице наличие товара хранится непосредственно информация о наличии товара, с указанием на товар(ПРОИЗВОДИТЕЛЬ и АРТИКУЛ) и соответственно наличие. Так же в этом поле есть наименование.
Любой товар имеет обязательное поле ПРОИЗВОДИТЕЛЬ и АРТИКУЛ.
В Справочнике может быть только 1 позиция с указанным ПРОИЗВОДИТЕЛЕМ и АРТИКЛЕМ, и может храниться наименование, а может и не хранится.
В таблице наличие товара может быть несколько с одним и тем же ПРОИЗВОДИТЕЛЕМ и АРТИКЛЕМ и наименование может отличаться, как отсутствовать, так и значительно отличаться.
Необязательно что товар который имеется в таблице наличие есть в таблице Справочник, так же как и наоборот.
Вопрос стоит в следующем. Надо например найти товар с артикулом 123 и когда один производитель имеет указанный артикул, то проблем нету, а когда несколько разных производителей имеют указанный артикул, вот тут то и надо вывести СПИСОК возможных производителей, в месте с артикулом.... Тут то вопросов тоже нету, но вот проблема в том что надо вывести ещё и наименование.
Причём по следующем правилам. Если наименование есть в справочнике, то вывести его, если его нету, то вывести первое наименование из списка Наличия.
И так для каждого ПРОИЗВОДИТЕЛЯ.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442246
Опишу имена полей.
Таблица Справочник
Поля
Id, Производитель, Артикул, наименование

Таблица Наличие
Id, Производитель, Артикул, наименование, количество
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442249
Следующий запрос вроде выводит всё правильно, но берёт первое наименование которое попалось, и если оно NULL то не берёт следующее
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT producer_name, article , detname 

FROM
( select DISTINCT производитель, артикул, наименование FROM Справочник WHERE артикул = '123'
UNION 
SELECT DISTINCT производитель, артикул, наименование FROM Наличие 
where артикул ='123') as Table1
GROUP BY producer_name, article;
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442251
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторСПИСОК возможных производителей
Код: sql
1.
group_concat(Производитель)


авторЕсли наименование есть в справочнике, то вывести его, если его нету, то вывести первое наименование из списка Наличия
Код: sql
1.
ifnull(Справочник.наименование, min(Наличие.наименование))



зы
с таким "подходом" к заданию вопроса, вам в литераторы нужно было идтить, а не запросы писать ...
нуу, вот что может быть проще - показать несколько строк данных в виде таблицы, и показать какой результат на этих данных вы хотите получить, вместо этого "сочинения" ... ??
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442253
Список возможных производителей с указанным артикулом не проблема, проблема в том чтобы с начало взять наименование из Справочника, а если его нет или оно равно NULL, то первое наименование из наличия (первое имеется в виду по ID). Опять же первое которое не NULL, так как оно и в справочнике может быть NULL и в Наличии может быть NULL
Показывать все строки с разным наименованием при одном и том же артикуле и производителе не имеет смысла и не правильно, так как это один и тот же товар!
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442257
qwerty112нуу, вот что может быть проще - показать несколько строк данных в виде таблицы, и показать какой результат на этих данных вы хотите получить, вместо этого "сочинения" ... ??

Если честно, то я не знаю как данные таблицы тут изобразить... :-)
Наверняка есть клиенты где можно просто результат получить и показать, но у меня вроде такого клиента нет.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442259
Кажется нашёл, сейчас по тестирую!

123456
5678910
1234565678910
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442260
Отлично, сейчас тогда напишу в таблицах.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442264
Таблица Spravochnik
spr_id spr_producer spr_article spr_name1AAA001Наименование2BBB001NULL3DDD001Творог4EEE001NULL

Таблица Nalichie
nal_id nal_producer nal_article spr_name nal_kolvo1AAA001NULL72AAA001Молоко33BBB001Кефир домик в деревне54BBB001Кефир25CCC001Ряженка46CCC001NULL67CCC001Ряженка Вкуснотеево38FFF001NULL6

Соответственно результат должен быть следующий
producerarticlenameAAA001НаименованиеBBB001Кефир домик в деревнеCCC001РяженкаDDD001ТворогEEE001NULLFFF001NULL
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442267
Без наименования Всё легко и просто, а вот с наименованием, по такой схеме возникают проблемы!
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442269
В таблице Nalichie поле spr_name прошу считать как nal_name
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442277
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АлександрLex,

тут бы FULL JOIN очень пригодился бы ..., но так как его в МуСКЛ нет, то прийдётся через UNION
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select n.nal_producer, n.nal_article, ifnull(s.spr_name, min(n.nal_name) as name 
from Spravochnik s right join Nalichie n on s.spr_producer=n.nal_producer and s.spr_article=n.nal_article 
group by n.nal_producer, n.nal_article, s.spr_name

union all

select s.spr_producer, s.spr_article, s.spr_name 
from Spravochnik s left join Nalichie n on s.spr_producer=n.nal_producer and s.spr_article=n.nal_article 
where n.nal_id is null
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442304
Результат получился следующий:
producerarticlenameAAA001НаименованиеBBB001КефирCCC001РяженкаDDD001ТворогEEE001NULLFFF001NULL


Производитель BBB взял получается Последнее наименование, а правильно наверное говорить минимальное.

Такой запрос у меня получался и делался немного по другому. Тут именно MIN и MAX дают не то что хочется, так как они отбирают минимальное и максимальное значение.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442319
АлександрLex,

Идеально сработал следующий запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
producer, 
article,
(
	SELECT sn.spr_name as nname FROM  spravochnik sn WHERE (sn.spr_producer=producer)AND(sn.spr_article)AND(sn.spr_name is not NULL)
	UNION
	SELECT nn.nal_name as nname FROM nalichie nn WHERE (nn.nal_producer=producer)AND(nn.nal_article)AND(nn.nal_name is not NULL) 
	LIMIT 1
) as nname
FROM 
(SELECT s.spr_producer as producer, s.spr_article as article FROM spravochnik s
UNION
SELECT n.nal_producer as producer, n.nal_article as article FROM nalichie n) as Table1;



Но меня смущает LIMIT 1 в UNION... Срабатывает так как надо, возвращает одну строчку, первую, даже если в первом запросе и во втором запросе есть результат! Но я думал что он будет относиться только к тому запросу за которым он стоит, а не к обоим.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442320
Критика по данному запросу будет?
Вроде запрос логичен, но кто что скажет... Интересует мнение!
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442557
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлександрLex,

ещё раз, пожалуйста (для тех, кто не понял):
- если наименование есть в справочнике то выводить его, независимо от тогоЮ есть ли какие-то другие наименования в "наличии"
- если его в справочнике нет, то выводить наименование из "наличия"
1)порядок верный?
2)если в "наличии" несколько наименований, какое именно выводить? последнее по id?
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442977
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select s.spr_producer, s.spr_article, ifnull(s.spr_name,n.nal_name) name
from(
  select nal_producer, nal_article, min(nal_id)id
  from Nalichie
  group by nal_producer, nal_article
  )g
join Nalichie n on n.nal_id=g.id
join Spravochnik s on s.spr_producer=g.nal_producer and s.spr_article=g.nal_article
union all
select s.spr_producer, s.spr_article, s.spr_name
from Spravochnik s
where not exists(
  select 1
  from Nalichie n
  where n.nal_producer=s.spr_producer and n.nal_article=s.spr_article
  );
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38442979
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл про LEFT JOIN Spravochnik :(
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38443183
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлександрLex,

Мужчина, может тебе сначала структуру базы слегка переделать, а потом уже запросы писать?
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38443205
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет смысла дрожать кривую бд и писарь на неё заумные запросы, они все равно не будут в конце концов работать, если таблицы чуть подрастут.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38443574
tanglirАлександрLex,

ещё раз, пожалуйста (для тех, кто не понял):
- если наименование есть в справочнике то выводить его, независимо от тогоЮ есть ли какие-то другие наименования в "наличии"
- если его в справочнике нет, то выводить наименование из "наличия"
1)порядок верный?
2)если в "наличии" несколько наименований, какое именно выводить? последнее по id?

1) Если наименование есть в справочнике, то да, Выводить его, если в справочнике нет наименования, но есть позиция в наличии с наименованием, то брать первое попавшееся(с минимальным ID) наименование которое присутствует и не пустое, если позиция есть и в справочнике, и в таблице наличие, но наименование нету, то просто оставить его пустым(ну не от куда его взять).

2) Выводить первое по ID, если у него тоже нет наименование то следующее по ID, и т.д. Если пустое наименование у всех, то выводить эту позицию , без наименования.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38443577
MasterZiv, а что именно предлагается прописать в структуре, что добавить? По моему структура и так проста и понятна.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38443617
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлександрLexMasterZiv, а что именно предлагается прописать в структуре, что добавить? По моему структура и так проста и понятна.


Да не должно быть такого, чтобы в справочнике товаров не было наименования товара.
Не должно быть такого, чтобы у товара был бы разные наименования.
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38443647
Может быть, некоторые позиции, а особенно большинство добавляются автоматически при добавлении из разных внешних данных.
Специфика такая что это необходимо... Единственное вопрос подтягивать может наименование , но данных действительно очень мого, несколько миллионов и поэтому это будет долго каждый раз подтягивать и проверять. По структуре лучше к сожалению не придумаешь... это практика показала...
...
Рейтинг: 0 / 0
Простой или сложный запрос?
    #38443698
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлександрLexСпецифика такая что это необходимо...


Не бывает такой специфики, чтобы делать херню.
Любую предметную область можно сделать хорошо, а можно сделать через жопу.
В твоём случае имеет место не первое.
Потому что в нормальной БД даже нужды в таких запросах не должно возникать.

АлександрLexЕдинственное вопрос подтягивать может наименование , но данных действительно очень мого, несколько миллионов и поэтому это будет долго каждый раз подтягивать и проверять. По структуре лучше к сожалению не придумаешь... это практика показала...


ЧТо подтягивать и проверять ? Товар из справочника? ЭТо один jOIN по индексу, это дёшево, никаких сложностей.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Простой или сложный запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]