powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дублируются запросы JOIN ON OR
19 сообщений из 19, страница 1 из 1
Дублируются запросы JOIN ON OR
    #39165054
lecherg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE TABLE `shop_items_sort` (
`item_id` int(11) NOT NULL,
`division_id` int(11) NOT NULL,
`sort` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `shop_items_sort`
ADD UNIQUE KEY `itemdiv` (`item_id`,`division_id`);

CREATE TABLE `shop_items` (
`id` int(11) NOT NULL,
`division_id` int(11) NOT NULL,
`divisions` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Есть основной раздел у товара - shop_items.division_id и дополнительные shop_items.divisions в виде (;1;;2;;3;;4;;5;)

Вторая таблица - shop_items_sort (item_id, division_id, sort)

Выдача дублирует некоторые строки и выдает несколько одинаковых.

SELECT shop_items.id FROM shop_items LEFT JOIN shop_items_sort as sort ON
shop_items.id = sort.item_id and
(sort.division_id = shop_items.division_id or
shop_items.divisions like CONCAT('%;', sort.division_id, ';%'))
where shop_items.division_id = "5" or shop_items.divisions like "%;5;%" order by sort.sort

Результат выдачи:
id
210
195
196
193
197
193
210
195
196
197
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165102
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть основной раздел у товара - shop_items.division_id и дополнительные shop_items.divisions в виде (;1;;2;;3;;4;;5;)


Нарушение 1НФ, нужно переделать бд чтобы его не было.

для запроса с таким ужасом - DISTINCT.

на самом деле не понятно на кой тебе там вообще JOIN...
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165112
lecherg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

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

Как тогда лучше это реализовать?
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165211
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, мягко говоря, немного не понимаю зачем надо писать дополнительные разделы в строку в основной таблице?
По-моему правильнее поле divisions вообще удалить. Достаточно чтобы в таблице shop_items_sort были перечислены построчно все разделы.
Тогда и запрос проще будет
Код: sql
1.
2.
3.
4.
SELECT sort.item_id FROM shop_items_sort as sort 
  INNER JOIN shop_items ON shop_items.id = sort.item_id
where sort.division_id = "5" 
order by sort.sort
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165215
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и джойн вообще убрать
Код: sql
1.
SELECT sort.item_id FROM shop_items_sort as sort where sort.division_id = "5" order by sort.sort
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165476
lecherg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну нужно ничего убирать! Нужно решить проблему именно с такими таблицами и именно в запросе! Проблема такая:

Выдает дубликаты, если условие по shop_items.divisions like '%;4;%' и у товаров разные shop_items.division_id = '4'.

То есть
Есть несколько item с division_id = '3', через SELECT shop_items.id FROM shop_items LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) where (shop_items.division_id = '3' or shop_items.divisions like '%;3;%' ) and shop_items.archive = '0' выдает все правильно.

Но Есть несколько item с division_id = N divisions = ';4;;5;;6;' через SELECT shop_items.id FROM shop_items LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) where (shop_items.division_id = '4' or shop_items.divisions like '%;4;%' ) and shop_items.archive = '0' order by sort.sort выдает кучу дупликатов.
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165508
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lecherg, посмотри свои данные. Скорее всего у item=197 и 210 есть дубликаты в данных

Если в shop_items
iddivision_iddivisions1975;3;4;
а в shop_items_sort
item_iddivision_idsort1975119731
то в соответствии с твоими условиями джойна наличие дубликатов говорит о правильной работе запроса
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165509
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lecherg, потому тебе и говорят, что надо менять структуру таблиц
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165528
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в shop_items
iddivision_iddivisions2103;4;5;
а в shop_items_sort
item_id division_id sort2104121052
то кончено при выборке раздела 5 будет выбрана из таблицы shop_items запись для item=210, которая заджойнит из таблицы shop_items_sort две записи по условию shop_items.id = sort.item_id а позже при проверке условия shop_items.divisions like CONCAT('%;', sort.division_id, ';%') ни одна из этих записей не будет убрана
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39165600
lecherg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Структуру таблиц изменить нельзя.
Содержание:

iddivision_iddivisions1932;5;1952;5;1962;5;1972;5;2102;5;

iddivision_iddivisions61;4;201;4;341;4;391;4;1412;4;


Результаты выдачи:

SELECT shop_items.id FROM shop_items LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) where (shop_items.division_id = '5' or shop_items.divisions like '%;5;%' ) and shop_items.archive = '0' order by sort.sort limit 0, 20

210
195
196
193
197
193
210
195
196
197

SELECT shop_items.id FROM shop_items LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) where (shop_items.division_id = '4' or shop_items.divisions like '%;4;%' ) and shop_items.archive = '0' order by sort.sort limit 0, 20

20
141
6
34
39
141

НЕОБХОДИМО:

Чтобы выводились товары только по параметрам:
SELECT shop_items.id FROM shop_items where (shop_items.division_id = '4' or shop_items.divisions like '%;4;%' ) and shop_items.archive = '0'

НО! Сортировались при выводе по: shop_items_sort as sort ON shop_items.id = sort.item_id and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) , order by sort.sort

То есть shop_items_sort никак не должен влиять на результат выдачи, а только на порядок. Как такое реализовать?
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166411
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lecherg, ну а содержимое shop_items_sort где? я же писал, что и во вторую таблицу надо заглянуть
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166431
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lechergСтруктуру таблиц изменить нельзя.
Содержание:

iddivision_iddivisions1932;5;1952;5;1962;5;1972;5;2102;5;


Гляжу я на эту табличку сквозь хрустальный шар и он мне показывает содержимое таблицы shop_items_sort:
item_iddivision_idsort19324193511952219553196231965419725197552102121052
Правильно мой хрустальный шар работает?
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166451
lecherg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mr.FontainelechergСтруктуру таблиц изменить нельзя.
Содержание:

iddivision_iddivisions1932;5;1952;5;1962;5;1972;5;2102;5;


Гляжу я на эту табличку сквозь хрустальный шар и он мне показывает содержимое таблицы shop_items_sort:
item_iddivision_idsort19324193511952219553196231965419725197552102121052
Правильно мой хрустальный шар работает?

Правильно. И как теперь исправить это все?
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166460
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lecherg, ну так вот есть вариант: Запрос без дублей
Чем он тебе не нравится?
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166489
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял. Тебе ещё что-то про shop_items.archive=0 надо упомянуть. Про который первоначально ничего не говорилось и понятно вчера запрос без этого условия писался
Код: sql
1.
2.
3.
4.
SELECT sort.item_id FROM shop_items_sort as sort 
  inner join shop_items as items on items.id=sort.item_id
where sort.division_id = "5" and items.archive="0"
order by sort.sort


как-то так...
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166502
lecherg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mr.FontaineПонял. Тебе ещё что-то про shop_items.archive=0 надо упомянуть. Про который первоначально ничего не говорилось и понятно вчера запрос без этого условия писался
Код: sql
1.
2.
3.
4.
SELECT sort.item_id FROM shop_items_sort as sort 
  inner join shop_items as items on items.id=sort.item_id
where sort.division_id = "5" and items.archive="0"
order by sort.sort


как-то так...

Этот запрос все отлично обрабатывает, но все же, есть ли возможность реализовать его через SELECT shop_items.id FROM shop_items ?
Бывают разделы, где товар выводится не через division или divisions, а через другигие таблицы параметров (new, разность между price и saleprice) и так далее. Тогда shop_items_sort не участвует совсем. А менять начало запроса на каждый вариант невозможно. Сейчас подставляется inner join и order by sort автоматически только в разделах. При других сортировках отсутствует.
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166609
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lecherg, я так и не понял, зачем у тебя в строку дивизионы записываются, а ты опять уже каких-то новых слов накидал. Мы ничего про твою БД не знаем. Про функционал тоже не знаем, а ты всё новые и новые правила придумываешь...
Где ты вообще увидел inner join? Ты нам только left join показывал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT shop_items.id 
FROM shop_items 
  LEFT JOIN shop_items_sort as sort 
  ON shop_items.id = sort.item_id 
    and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) 
where (shop_items.division_id = '5' or shop_items.divisions like '%;5;%' ) 
  and shop_items.archive = '0' 
order by sort.sort limit 0, 20


То есть хочешь сказать, то запрос у тебя строится из пяти отдельно сгенерированных строк?
Код: plaintext
1.
2.
3.
4.
5.
первая - SELECT shop_items.id FROM shop_items
вторая - LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) 
третья - where (shop_items.division_id = '5' or shop_items.divisions like '%;5;%' ) 
четвёртая - order by sort.sort 
пятая - limit 0, 20
Причём первая, третья и пятая части есть всегда, а вторая и четвёртая только в некоторых случаях?
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39166990
lecherg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mr.Fontainelecherg, я так и не понял, зачем у тебя в строку дивизионы записываются, а ты опять уже каких-то новых слов накидал. Мы ничего про твою БД не знаем. Про функционал тоже не знаем, а ты всё новые и новые правила придумываешь...
Где ты вообще увидел inner join? Ты нам только left join показывал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT shop_items.id 
FROM shop_items 
  LEFT JOIN shop_items_sort as sort 
  ON shop_items.id = sort.item_id 
    and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) 
where (shop_items.division_id = '5' or shop_items.divisions like '%;5;%' ) 
  and shop_items.archive = '0' 
order by sort.sort limit 0, 20


То есть хочешь сказать, то запрос у тебя строится из пяти отдельно сгенерированных строк?
Код: plaintext
1.
2.
3.
4.
5.
первая - SELECT shop_items.id FROM shop_items
вторая - LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and (sort.division_id = shop_items.division_id or shop_items.divisions like CONCAT('%;', sort.division_id, ';%')) 
третья - where (shop_items.division_id = '5' or shop_items.divisions like '%;5;%' ) 
четвёртая - order by sort.sort 
пятая - limit 0, 20
Причём первая, третья и пятая части есть всегда, а вторая и четвёртая только в некоторых случаях?

Правильно. Запрос генерится из 5 различных строк. Первая есть всегда, остальные постоянно меняются. Всего около 30 комбинаций. Проблемы в системе ТОЛЬКО с совмещением этого запроса и сортировки. Раньше была только сортировка по основному разделу division_id и проблем небыло. Теперь необходимо, не удаляя SELECT shop_items.id FROM shop_items, добавить сортировку по дополнительному разделу. DISTINCT и GROUP не использовать. Третьи сутки читаю форумы зарубежные. Походу это реализовать невозможно.
...
Рейтинг: 0 / 0
Дублируются запросы JOIN ON OR
    #39167241
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lecherg, да как так нельзя? Тут же всё элементарно. Посмотри такой вариант
Код: sql
1.
2.
3.
SELECT shop_items.id FROM (select id, '5' as division_id from shop_items where (shop_items.division_id = '5' or shop_items.divisions like '%;5;%') and archive='0') as shop_items
LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and sort.division_id = shop_items.division_id order by sort.sort              
limti 0, 20


Подставляй нужный номер раздела в три места и будет тебе счастье
Учитывая, что where (судя из твоего ответа может быть не всегда), то этот запрос можно разбить на строки так:
Код: plaintext
1.
2.
3.
4.
5.
6.
первая - SELECT shop_items.id FROM
вторая - (select id, '5' as division_id from shop_items where (shop_items.division_id = '5' or shop_items.divisions like '%;5;%') and archive='0') as 
третья  -  shop_items
четвёртая - LEFT JOIN shop_items_sort as sort ON shop_items.id = sort.item_id and sort.division_id = shop_items.division_id 
пятая  - order by sort.sort 
шестая - limit 0, 20

P.S. вёл я тебя, вёл к этому варианту, но ты, честно говоря, чё-то плохо читаешь советы.
Думается мне, ты так и не разобрался почему у тебя двоят записи....
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дублируются запросы JOIN ON OR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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