|
|
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 15:21 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Есть основной раздел у товара - shop_items.division_id и дополнительные shop_items.divisions в виде (;1;;2;;3;;4;;5;) Нарушение 1НФ, нужно переделать бд чтобы его не было. для запроса с таким ужасом - DISTINCT. на самом деле не понятно на кой тебе там вообще JOIN... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 18:32 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Так как должна быть различная сортировка в разных разделах. Есть основной раздел, к примеру, брюки - там товары. Есть второй раздел - Рубашки, там тоже товары. А есть третий раздел - Праздничная одежда. В товаре указываем его как дополнительный и в праздничной одежде, к примеру будут и брюки и рубашки. Так вот, нужно вручную задавать сортировку по данному разделу, отдельную от основного раздела. Как тогда лучше это реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2016, 18:54 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Я, мягко говоря, немного не понимаю зачем надо писать дополнительные разделы в строку в основной таблице? По-моему правильнее поле divisions вообще удалить. Достаточно чтобы в таблице shop_items_sort были перечислены построчно все разделы. Тогда и запрос проще будет Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 07:43 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Да и джойн вообще убрать Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 07:46 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Ну нужно ничего убирать! Нужно решить проблему именно с такими таблицами и именно в запросе! Проблема такая: Выдает дубликаты, если условие по 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 выдает кучу дупликатов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 13:10 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
lecherg, посмотри свои данные. Скорее всего у item=197 и 210 есть дубликаты в данных Если в shop_items iddivision_iddivisions1975;3;4; а в shop_items_sort item_iddivision_idsort1975119731 то в соответствии с твоими условиями джойна наличие дубликатов говорит о правильной работе запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 13:43 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
lecherg, потому тебе и говорят, что надо менять структуру таблиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 13:44 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Если в 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, ';%') ни одна из этих записей не будет убрана ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 13:54 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Структуру таблиц изменить нельзя. Содержание: 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 никак не должен влиять на результат выдачи, а только на порядок. Как такое реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2016, 14:43 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
lecherg, ну а содержимое shop_items_sort где? я же писал, что и во вторую таблицу надо заглянуть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 11:52 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
lechergСтруктуру таблиц изменить нельзя. Содержание: iddivision_iddivisions1932;5;1952;5;1962;5;1972;5;2102;5; Гляжу я на эту табличку сквозь хрустальный шар и он мне показывает содержимое таблицы shop_items_sort: item_iddivision_idsort19324193511952219553196231965419725197552102121052 Правильно мой хрустальный шар работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 12:03 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Mr.FontainelechergСтруктуру таблиц изменить нельзя. Содержание: iddivision_iddivisions1932;5;1952;5;1962;5;1972;5;2102;5; Гляжу я на эту табличку сквозь хрустальный шар и он мне показывает содержимое таблицы shop_items_sort: item_iddivision_idsort19324193511952219553196231965419725197552102121052 Правильно мой хрустальный шар работает? Правильно. И как теперь исправить это все? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 12:18 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
lecherg, ну так вот есть вариант: Запрос без дублей Чем он тебе не нравится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 12:24 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Понял. Тебе ещё что-то про shop_items.archive=0 надо упомянуть. Про который первоначально ничего не говорилось и понятно вчера запрос без этого условия писался Код: sql 1. 2. 3. 4. как-то так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 12:38 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Mr.FontaineПонял. Тебе ещё что-то про shop_items.archive=0 надо упомянуть. Про который первоначально ничего не говорилось и понятно вчера запрос без этого условия писался Код: sql 1. 2. 3. 4. как-то так... Этот запрос все отлично обрабатывает, но все же, есть ли возможность реализовать его через SELECT shop_items.id FROM shop_items ? Бывают разделы, где товар выводится не через division или divisions, а через другигие таблицы параметров (new, разность между price и saleprice) и так далее. Тогда shop_items_sort не участвует совсем. А менять начало запроса на каждый вариант невозможно. Сейчас подставляется inner join и order by sort автоматически только в разделах. При других сортировках отсутствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 12:51 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
lecherg, я так и не понял, зачем у тебя в строку дивизионы записываются, а ты опять уже каких-то новых слов накидал. Мы ничего про твою БД не знаем. Про функционал тоже не знаем, а ты всё новые и новые правила придумываешь... Где ты вообще увидел inner join? Ты нам только left join показывал Код: sql 1. 2. 3. 4. 5. 6. 7. 8. То есть хочешь сказать, то запрос у тебя строится из пяти отдельно сгенерированных строк? Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 13:54 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
Mr.Fontainelecherg, я так и не понял, зачем у тебя в строку дивизионы записываются, а ты опять уже каких-то новых слов накидал. Мы ничего про твою БД не знаем. Про функционал тоже не знаем, а ты всё новые и новые правила придумываешь... Где ты вообще увидел inner join? Ты нам только left join показывал Код: sql 1. 2. 3. 4. 5. 6. 7. 8. То есть хочешь сказать, то запрос у тебя строится из пяти отдельно сгенерированных строк? Код: plaintext 1. 2. 3. 4. 5. Правильно. Запрос генерится из 5 различных строк. Первая есть всегда, остальные постоянно меняются. Всего около 30 комбинаций. Проблемы в системе ТОЛЬКО с совмещением этого запроса и сортировки. Раньше была только сортировка по основному разделу division_id и проблем небыло. Теперь необходимо, не удаляя SELECT shop_items.id FROM shop_items, добавить сортировку по дополнительному разделу. DISTINCT и GROUP не использовать. Третьи сутки читаю форумы зарубежные. Походу это реализовать невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2016, 18:10 |
|
||
|
Дублируются запросы JOIN ON OR
|
|||
|---|---|---|---|
|
#18+
lecherg, да как так нельзя? Тут же всё элементарно. Посмотри такой вариант Код: sql 1. 2. 3. Подставляй нужный номер раздела в три места и будет тебе счастье Учитывая, что where (судя из твоего ответа может быть не всегда), то этот запрос можно разбить на строки так: Код: plaintext 1. 2. 3. 4. 5. 6. P.S. вёл я тебя, вёл к этому варианту, но ты, честно говоря, чё-то плохо читаешь советы. Думается мне, ты так и не разобрался почему у тебя двоят записи.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2016, 06:38 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39165112&tid=1832174]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
194ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 552ms |

| 0 / 0 |
