powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
14 сообщений из 39, страница 2 из 2
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39501505
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, в общем я хочу получить: в гриде список товаров, сгруппированых по категории, с фильтрацией по атрибутам.
Т.е. мне нужны данные: Название, Цена, Атрибуты(если упростить).

Я поколдовал, посмотрел, читал "кое-чего в интернете". После экспериментов пришёл к выводу, который уже написан:
>>
Перед созданием таблицы "TOBAPbl" выполняется запрос к базе данных и берутся все атрибуты, и из них создаётся приписка, которая создаёт дополнительные колонки для таблицы "TOBAPbl". Т.е. эта таблица имеет колонки-атрибуты.
>>
Самое быстрое решение.

В общем. Тестовый SQL Запрос на вывод товаров категории(Ограничил атрибуты до 3 шт.):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
"SELECT `id_TOBAPA`, `HAZBAHuE`, `MODELb`, `APTuKyL`, `KPATHOCTb`, `DOCTynHIOCTb`, `KAPTuHKA`, `KATEGOPuia`, `tcEHA` , KOLOHKA1239, KOLOHKA1267, KOLOHKA1272
 FROM `TOBAPbl`
 WHERE `KATEGOPuia`='64' OR `KATEGOPuia`='2800' OR `KATEGOPuia`='2612' OR `KATEGOPuia`='2882' OR `KATEGOPuia`='2761' OR 
`KATEGOPuia`='2715' OR `KATEGOPuia`='2596' OR `KATEGOPuia`='2590' OR `KATEGOPuia`='2626' OR `KATEGOPuia`='2655' OR 
`KATEGOPuia`='2795' OR `KATEGOPuia`='2873' OR `KATEGOPuia`='2889' OR `KATEGOPuia`='2862' OR `KATEGOPuia`='2774' OR 
`KATEGOPuia`='2693' OR `KATEGOPuia`='2841' OR `KATEGOPuia`='2796' OR `KATEGOPuia`='2760' OR `KATEGOPuia`='2680' OR 
`KATEGOPuia`='2720' OR `KATEGOPuia`='2656' OR `KATEGOPuia`='2727' OR `KATEGOPuia`='2768' OR `KATEGOPuia`='2750' OR 
`KATEGOPuia`='2705' OR `KATEGOPuia`='2608' OR `KATEGOPuia`='2745' OR `KATEGOPuia`='2676' OR `KATEGOPuia`='2790' OR 
`KATEGOPuia`='2700' OR `KATEGOPuia`='2749' OR `KATEGOPuia`='24560' OR `KATEGOPuia`='2884' OR `KATEGOPuia`='2717' OR 
`KATEGOPuia`='2880' OR `KATEGOPuia`='2786' OR `KATEGOPuia`='2592' OR `KATEGOPuia`='2595' OR `KATEGOPuia`='2642' OR 
`KATEGOPuia`='2598' OR `KATEGOPuia`='2627' OR `KATEGOPuia`='2854' OR `KATEGOPuia`='2633' OR `KATEGOPuia`='2638' OR 
`KATEGOPuia`='2689' OR `KATEGOPuia`='2883' OR `KATEGOPuia`='2714' OR `KATEGOPuia`='24722' OR `KATEGOPuia`='2618' OR 
`KATEGOPuia`='2861' OR `KATEGOPuia`='24723' OR `KATEGOPuia`='2624' OR `KATEGOPuia`='2801' OR `KATEGOPuia`='2855' OR 
`KATEGOPuia`='2856' OR `KATEGOPuia`='2763' OR `KATEGOPuia`='2670' OR `KATEGOPuia`='2639' OR `KATEGOPuia`='2869' OR 
`KATEGOPuia`='2798' OR `KATEGOPuia`='2762' OR `KATEGOPuia`='2615' OR `KATEGOPuia`='2863' OR `KATEGOPuia`='2772' OR 
`KATEGOPuia`='2775' OR `KATEGOPuia`='2857' OR `KATEGOPuia`='2874' OR `KATEGOPuia`='2603' OR `KATEGOPuia`='2709' OR 
`KATEGOPuia`='24897' OR `KATEGOPuia`='2650' OR `KATEGOPuia`='2671' OR `KATEGOPuia`='2640' OR `KATEGOPuia`='2793' OR 
`KATEGOPuia`='2663' OR `KATEGOPuia`='2699' OR `KATEGOPuia`='2780' OR `KATEGOPuia`='2637' OR `KATEGOPuia`='2607' OR 
`KATEGOPuia`='24724' OR `KATEGOPuia`='2789' OR `KATEGOPuia`='2799' OR `KATEGOPuia`='2748' OR `KATEGOPuia`='2784' OR 
`KATEGOPuia`='2859' OR `KATEGOPuia`='24898' OR `KATEGOPuia`='2787' OR `KATEGOPuia`='2614' OR `KATEGOPuia`='2664' OR 
`KATEGOPuia`='2636' OR `KATEGOPuia`='24896' OR `KATEGOPuia`='24715' OR `KATEGOPuia`='2845' OR `KATEGOPuia`='2823' OR 
`KATEGOPuia`='2837' OR `KATEGOPuia`='2872' OR `KATEGOPuia`='2711' OR `KATEGOPuia`='2635' OR `KATEGOPuia`='2866' OR 
`KATEGOPuia`='2619' OR `KATEGOPuia`='2773' OR `KATEGOPuia`='2842' OR `KATEGOPuia`='2691' OR `KATEGOPuia`='2599' OR 
`KATEGOPuia`='2890' OR `KATEGOPuia`='2875' OR `KATEGOPuia`='2593' OR `KATEGOPuia`='2776' OR `KATEGOPuia`='24716' OR 
`KATEGOPuia`='2853' OR `KATEGOPuia`='2611' OR `KATEGOPuia`='2613' OR `KATEGOPuia`='2886' OR `KATEGOPuia`='2602' OR 
`KATEGOPuia`='2692' OR `KATEGOPuia`='2634' OR `KATEGOPuia`='2662' OR `KATEGOPuia`='2631' OR `KATEGOPuia`='2844' OR 
`KATEGOPuia`='2601' OR `KATEGOPuia`='22356' OR `KATEGOPuia`='2739' OR `KATEGOPuia`='2721' OR `KATEGOPuia`='2783' OR 
`KATEGOPuia`='2657' OR `KATEGOPuia`='2621' OR `KATEGOPuia`='2668' OR `KATEGOPuia`='2616' OR `KATEGOPuia`='2701' OR 
`KATEGOPuia`='2610' OR `KATEGOPuia`='2716' OR `KATEGOPuia`='2782' OR `KATEGOPuia`='2858' OR `KATEGOPuia`='22355' OR 
`KATEGOPuia`='2594' OR `KATEGOPuia`='2820' OR `KATEGOPuia`='2609' OR `KATEGOPuia`='2591' OR `KATEGOPuia`='2870' OR 
`KATEGOPuia`='2677' OR `KATEGOPuia`='2757' OR `KATEGOPuia`='2669' OR `KATEGOPuia`='2718' OR `KATEGOPuia`='2726' OR 
`KATEGOPuia`='2605' OR `KATEGOPuia`='2753' OR `KATEGOPuia`='2876' OR `KATEGOPuia`='2702' OR `KATEGOPuia`='2887' OR 
`KATEGOPuia`='2877' OR `KATEGOPuia`='23653' OR `KATEGOPuia`='2769' OR `KATEGOPuia`='2708' OR `KATEGOPuia`='2885' OR 
`KATEGOPuia`='2630' OR `KATEGOPuia`='2622' OR `KATEGOPuia`='2812' OR `KATEGOPuia`='2686' OR `KATEGOPuia`='2698' OR 
`KATEGOPuia`='24718' OR `KATEGOPuia`='2641' OR `KATEGOPuia`='2785' OR `KATEGOPuia`='2852' OR `KATEGOPuia`='2719' OR 
`KATEGOPuia`='2831' OR `KATEGOPuia`='2815' OR `KATEGOPuia`='2878' OR `KATEGOPuia`='2625' OR `KATEGOPuia`='24533' OR 
`KATEGOPuia`='2794' OR `KATEGOPuia`='2871' OR `KATEGOPuia`='2632' OR `KATEGOPuia`='2604' OR `KATEGOPuia`='2651' OR 
`KATEGOPuia`='2606' OR `KATEGOPuia`='2623' OR `KATEGOPuia`='2867' OR `KATEGOPuia`='2597' OR `KATEGOPuia`='2868' OR 
`KATEGOPuia`='2620' OR `KATEGOPuia`='24561' OR `KATEGOPuia`='2788' OR `KATEGOPuia`='2600' OR `KATEGOPuia`='2690' OR 
`KATEGOPuia`='2818' OR `KATEGOPuia`='2879' OR `KATEGOPuia`='2881' OR `KATEGOPuia`='2888' OR `KATEGOPuia`='2777' OR 
`KATEGOPuia`='22354' OR `KATEGOPuia`='24017' OR `KATEGOPuia`='2802' OR `KATEGOPuia`='2781' OR `KATEGOPuia`='2703' OR 
`KATEGOPuia`='2617' OR `KATEGOPuia`='2712' OR `KATEGOPuia`='2658' OR `KATEGOPuia`='2843' OR `KATEGOPuia`='2864' OR 
`KATEGOPuia`='2860' OR `KATEGOPuia`='2797' OR `KATEGOPuia`='22782' OR `KATEGOPuia`='2710' OR `KATEGOPuia`='2713' OR 
`KATEGOPuia`='2694' OR `KATEGOPuia`='2681' OR `KATEGOPuia`='2729' OR `KATEGOPuia`='2706' OR `KATEGOPuia`='2791' OR 
`KATEGOPuia`='2707' OR `KATEGOPuia`='2734' OR `KATEGOPuia`='2685' OR `KATEGOPuia`='22895' OR `KATEGOPuia`='2643' OR 
`KATEGOPuia`='22597' OR `KATEGOPuia`='2846' OR `KATEGOPuia`='2839' OR `KATEGOPuia`='2740' OR `KATEGOPuia`='2865' OR 
`KATEGOPuia`='2736' OR `KATEGOPuia`='2667' OR `KATEGOPuia`='2764' OR `KATEGOPuia`='2765' OR `KATEGOPuia`='2804' OR 
`KATEGOPuia`='2738' OR `KATEGOPuia`='22684' OR `KATEGOPuia`='2847' OR `KATEGOPuia`='22598' OR `KATEGOPuia`='2826' OR 
`KATEGOPuia`='2848' OR `KATEGOPuia`='2807' OR `KATEGOPuia`='2683' OR `KATEGOPuia`='2682' OR `KATEGOPuia`='2724' OR 
`KATEGOPuia`='2755' OR `KATEGOPuia`='2723' OR `KATEGOPuia`='2838' OR `KATEGOPuia`='2674' OR `KATEGOPuia`='2728' OR 
`KATEGOPuia`='2697' OR `KATEGOPuia`='2747' OR `KATEGOPuia`='23929' OR `KATEGOPuia`='2737' OR `KATEGOPuia`='2741' OR 
`KATEGOPuia`='2732' OR `KATEGOPuia`='2646' OR `KATEGOPuia`='2735' OR `KATEGOPuia`='2816' OR `KATEGOPuia`='2653' OR 
`KATEGOPuia`='2742' OR `KATEGOPuia`='2803' OR `KATEGOPuia`='2629' OR `KATEGOPuia`='2660' OR `KATEGOPuia`='2666' OR 
`KATEGOPuia`='2679' OR `KATEGOPuia`='2771' OR `KATEGOPuia`='24821' OR `KATEGOPuia`='2891' OR `KATEGOPuia`='22894' OR 
`KATEGOPuia`='2840' OR `KATEGOPuia`='2725' OR `KATEGOPuia`='2684' OR `KATEGOPuia`='2652' OR `KATEGOPuia`='2767' OR 
`KATEGOPuia`='2673' OR `KATEGOPuia`='2758' OR `KATEGOPuia`='2759' OR `KATEGOPuia`='2756' OR `KATEGOPuia`='24958' OR 
`KATEGOPuia`='2731' OR `KATEGOPuia`='2722' OR `KATEGOPuia`='2751' OR `KATEGOPuia`='2754' OR `KATEGOPuia`='2730' OR 
`KATEGOPuia`='2835' OR `KATEGOPuia`='2687' OR `KATEGOPuia`='24626' OR `KATEGOPuia`='2688' OR `KATEGOPuia`='2805' OR 
`KATEGOPuia`='2832' OR `KATEGOPuia`='2746' OR `KATEGOPuia`='24717' OR `KATEGOPuia`='2743' OR `KATEGOPuia`='2696' OR 
`KATEGOPuia`='2675' OR `KATEGOPuia`='2744' OR `KATEGOPuia`='24719' OR `KATEGOPuia`='2779' OR `KATEGOPuia`='2648' OR 
`KATEGOPuia`='2806' OR `KATEGOPuia`='2819' OR `KATEGOPuia`='22682' OR `KATEGOPuia`='2778' OR `KATEGOPuia`='22683' OR 
`KATEGOPuia`='2628' OR `KATEGOPuia`='2659' OR `KATEGOPuia`='2665' OR `KATEGOPuia`='2678' OR `KATEGOPuia`='2770' OR 
`KATEGOPuia`='2766' OR `KATEGOPuia`='2733' OR `KATEGOPuia`='2654' OR `KATEGOPuia`='22357' OR `KATEGOPuia`='2661' OR 
`KATEGOPuia`='24627' OR `KATEGOPuia`='2792' OR `KATEGOPuia`='2672' OR `KATEGOPuia`='2695' OR `KATEGOPuia`='2647' OR 
`KATEGOPuia`='2810' OR `KATEGOPuia`='2849' OR `KATEGOPuia`='2808' OR `KATEGOPuia`='2644' OR `KATEGOPuia`='2809' OR 
`KATEGOPuia`='2834' OR `KATEGOPuia`='2811' OR `KATEGOPuia`='2645' OR `KATEGOPuia`='2851' OR `KATEGOPuia`='2850'
 LIMIT 0, 2282"

, где "KOLOHKA" - атрибуты. LIMIT - Для деления на многопоточность(количество потоков определяет интервал).

Я конечно понимаю: плохо выглядит запрос. Но речь идёт об "списке товаров раздела". Т.е. "куча категорий". Может и 50 шт. Может и больше. Категории записаны(кому-что принадлежит) в таблице товаров. Имеет смысл что-то менять в структуре базы? Или может другой запрос надо писать? Можно пример? Приму любые комментарии по моему ужасу.

Дополнение:
1)
Цикл:
1. Результат запроса(из 1-й таблицы(проходимся по каждому товару, для записи его данных на вывод), конкретный товар)
2. По его id я делаю запрос в этом же соединении на "список атрибутов"
3. Записываю в массив на вывод
Не вариант. Медленно.

2)

Колонка "KATEGOPuia" в таблице "TOBAPbl" - проиндексирована.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39501535
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
47911,

даа.... Знатное извращение.
Про соединение таблиц ты не слышал ни разу?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.`id_TOBAPA`, t.`HAZBAHuE`, t.`MODELb`, t.`APTuKyL`, t.`KPATHOCTb`, t.`DOCTynHIOCTb`, t.`KAPTuHKA`, t.`KATEGOPuia`, t.`tcEHA` ,
ta1.ZHA4eHue as  KOLOHKA1239, ta2.ZHA4eHue as KOLOHKA1267, ta3.ZHA4eHue as KOLOHKA1272
FROM KATEGOPuu k
join `TOBAPbl`t on k.`id_KATEGOPuu`=t.`KATEGOPuia`
join `TOBAPbl_ATTPu6yTbl` ta1 on t.`id_TOBAPA` = ta1.`id_TOBAPA`
join `ATTPu6yTbl` a1 on ta1.`id_ATPu6yTA` = a1.`id_ATPu6yTA` and a1.`Tun`= 'KOLOHKA1239'
join `TOBAPbl_ATTPu6yTbl` ta2 on t.`id_TOBAPA` = ta2.`id_TOBAPA`
join `ATTPu6yTbl` a2 on ta2.`id_ATPu6yTA` = a2.`id_ATPu6yTA` and a2.`Tun`= 'KOLOHKA1267'
join `TOBAPbl_ATTPu6yTbl` ta3 on t.`id_TOBAPA` = ta3.`id_TOBAPA`
join `ATTPu6yTbl` a3 on ta3.`id_ATPu6yTA` = a3.`id_ATPu6yTA` and a3.`Tun`= 'KOLOHKA1272'
where k.criteria_for_KATEGOPuu = 'моя крутая категория'


И все...
Только убедись что у тебя по всем полям используемым для соединений есть индексы.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39501679
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень благодарен за такой ответ. Но есть ещё вопросы.
White Owl47911,

даа.... Знатное извращение.
Про соединение таблиц ты не слышал ни разу?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.`id_TOBAPA`, t.`HAZBAHuE`, t.`MODELb`, t.`APTuKyL`, t.`KPATHOCTb`, t.`DOCTynHIOCTb`, t.`KAPTuHKA`, t.`KATEGOPuia`, t.`tcEHA` ,
ta1.ZHA4eHue as  KOLOHKA1239, ta2.ZHA4eHue as KOLOHKA1267, ta3.ZHA4eHue as KOLOHKA1272
FROM KATEGOPuu k
join `TOBAPbl`t on k.`id_KATEGOPuu`=t.`KATEGOPuia`
join `TOBAPbl_ATTPu6yTbl` ta1 on t.`id_TOBAPA` = ta1.`id_TOBAPA`
join `ATTPu6yTbl` a1 on ta1.`id_ATPu6yTA` = a1.`id_ATPu6yTA` and a1.`Tun`= 'KOLOHKA1239'
join `TOBAPbl_ATTPu6yTbl` ta2 on t.`id_TOBAPA` = ta2.`id_TOBAPA`
join `ATTPu6yTbl` a2 on ta2.`id_ATPu6yTA` = a2.`id_ATPu6yTA` and a2.`Tun`= 'KOLOHKA1267'
join `TOBAPbl_ATTPu6yTbl` ta3 on t.`id_TOBAPA` = ta3.`id_TOBAPA`
join `ATTPu6yTbl` a3 on ta3.`id_ATPu6yTA` = a3.`id_ATPu6yTA` and a3.`Tun`= 'KOLOHKA1272'
where k.criteria_for_KATEGOPuu = 'моя крутая категория'


И все...
Только убедись что у тебя по всем полям используемым для соединений есть индексы.

Сер. А "k.criteria_for_KATEGOPuu = 'моя крутая категория'" годится, если я правильно понимаю и меня не обманывает мой мозг: годиться для 1 категории?(k.criteria_for_KATEGOPuu = '62') Или имеется ввиду что: вместо "k.criteria_for_KATEGOPuu = 'моя крутая категория'" будет то самое "Знатное извращение." вида "`KATEGOPuia`='2590' OR `KATEGOPuia`='2626' OR "?
У меня в таблице категорий - именно иерархия:

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `KATEGOPuu`(
						`id_KATEGOPuu` INTEGER ASC,
						`HAZBAHuE` TEXT,
						`PODuTELb` INTEGER,
						`yPOBEHb` INTEGER,
Поле для некоторых отметок:	`PEDAKTuPOBAHuE` TEXT 
						);



А у товаров прописывается только категория, в которой они лежат. Или лучше иметь доп.колонку - с id раздела?(что-то мне подсказывает - это ускорит выдачу. Только щас об этом подумал. . .)

Поясните: при обращении T["ta1.ZHA4eHue"](в шарпе, каждый проход цикла имеет массив "T", в нём результат прохода) я получу "аттрибут KOLOHKA1239 товара(значение атрибута)"? Т.е. как получить результат обращения-> конкретный атрибут?

Также поясните(проговорите словами) эту конструкцию:
Код: sql
1.
2.
3.
4.
5.
6.
7.
join `TOBAPbl`t on k.`id_KATEGOPuu`=t.`KATEGOPuia`
join `TOBAPbl_ATTPu6yTbl` ta1 on t.`id_TOBAPA` = ta1.`id_TOBAPA`
join `ATTPu6yTbl` a1 on ta1.`id_ATPu6yTA` = a1.`id_ATPu6yTA` and a1.`Tun`= 'KOLOHKA1239'
join `TOBAPbl_ATTPu6yTbl` ta2 on t.`id_TOBAPA` = ta2.`id_TOBAPA`
join `ATTPu6yTbl` a2 on ta2.`id_ATPu6yTA` = a2.`id_ATPu6yTA` and a2.`Tun`= 'KOLOHKA1267'
join `TOBAPbl_ATTPu6yTbl` ta3 on t.`id_TOBAPA` = ta3.`id_TOBAPA`
join `ATTPu6yTbl` a3 on ta3.`id_ATPu6yTA` = a3.`id_ATPu6yTA` and a3.`Tun`= 'KOLOHKA1272'


Про join я слышал\видел как пользуются. Но до сегоднешнего дня я не вникал в него. У меня лишь поверхностное понимание: позволяет реализовывать сложные условия выборки. Но без подробностей, т.к. обходился без него.

Т.к. я за эти несколько дней "что-то менял в базе"(при создании таблиц) я пишу полную инфу(на какой базе щас делаю тесты) ниже(чтобы была исчерпывающая инфа по вопросу, для которого я эту тему и создал).

Вот что создаёт базу(SQL запрос в SQLite3):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
PRAGMA synchronous = OFF;PRAGMA temp_store = MEMORY;PRAGMA foreign_keys=on;
BEGIN TRANSACTION;
CREATE TABLE `TOBAPbl_ATTPu6yTbl`(
						`id_TOBAPA` INTEGER,
						`id_ATPu6yTA` INTEGER,
						`ZHA4eHue` TEXT
						);
CREATE TABLE `ATTPu6yTbl`(
						`id_ATPu6yTA` INTEGER ASC,
						`HAZBAHuE` TEXT,
						`Tun` TEXT
						);
CREATE TABLE `TOBAPbl_KAPTuHKu`(
						`id_TOBAPA` INTEGER ASC,
						`KAPTuHKA` TEXT
						);
CREATE TABLE `KATEGOPuu`(
						`id_KATEGOPuu` INTEGER ASC,
						`HAZBAHuE` TEXT,
						`PODuTELb` INTEGER,
						`yPOBEHb` INTEGER,
						`PEDAKTuPOBAHuE` TEXT
						);
CREATE TABLE `TOBAPbl`(
						`id_TOBAPA` INTEGER ASC,
						`HAZBAHuE` TEXT,
						`MODELb` TEXT,
						`APTuKyL` TEXT,
						`KPATHOCTb` INTEGER,
						`DOCTynHIOCTb` INTEGER,
						`KAPTuHKA` TEXT,
						`nPOuZBODuTELb` TEXT,
						`OnuCAHuE` TEXT,
						`KATEGOPuia` INTEGER ASC,
						`tcEHA` INTEGER,
						`CTATyC` TEXT,
						`BPEMia_HA4ALO` INTEGER,
						`BPEMia_KOEtc` INTEGER,
						`AKtcuia_HA4ALO` INTEGER,
						`AKtcuia_KOEtc` INTEGER,
						`PEDAKTuPOBAHuE` TEXT
$DOn_KOLOHKu
						);

CREATE UNIQUE INDEX IF NOT EXISTS `uHDEKC_id_TOBAPA` ON `TOBAPbl` (`id_TOBAPA`);
CREATE INDEX IF NOT EXISTS `uHDEKC_KATEGOPuia` ON `TOBAPbl` (`KATEGOPuia`);
CREATE UNIQUE INDEX IF NOT EXISTS `uHDEKC_id_KATEGOPuu` ON `KATEGOPuu` (`id_KATEGOPuu`);
CREATE UNIQUE INDEX IF NOT EXISTS `uHDEKC_id_ATPu6yTA` ON `ATTPu6yTbl` (`id_ATPu6yTA`);
CREATE INDEX IF NOT EXISTS `uHDEKC_T_id_ATPu6yTA` ON `TOBAPbl_ATTPu6yTbl` (`id_ATPu6yTA`);
CREATE INDEX IF NOT EXISTS `uHDEKC_T_id_TOBAPA` ON `TOBAPbl_ATTPu6yTbl` (`id_TOBAPA`);
COMMIT;


$DOn_KOLOHKu - место, где я комментируя строку - отменяю создание колонок-атрибутов у таблицы.

Ключи "references" пока не использую, т.к. есть данные(в базе-доноре) которые являются мусором. Пока пусть будут. Для них обработка будет придумана позже.

И, как следствие: я с этой базой и работаю.

Жду ответы на вопросы, от White Owl.

Огромная благодарность за то, что ещё тратите на меня время.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39502023
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
47911Сер. А "k.criteria_for_KATEGOPuu = 'моя крутая категория'" годится, если я правильно понимаю и меня не обманывает мой мозг: годиться для 1 категории?Да. k.HAZBAHuE = 'моя крутая категория' это выборка одной строки.
Для нескольких будет k.HAZBAHuE in('a', 'b', 'c')

47911Поясните: при обращении T["ta1.ZHA4eHue"](в шарпе, каждый проход цикла имеет массив "T", в нём результат прохода) я получу "аттрибут KOLOHKA1239 товара(значение атрибута)"? Т.е. как получить результат обращения-> конкретный атрибут?C# здесь нет ни грамма. Это все один цельный запрос отсылаемый в СУБД и возвращающий один единственный резалтсет.

47911Про join я слышал\видел как пользуются. Но до сегоднешнего дня я не вникал в него. У меня лишь поверхностное понимание: позволяет реализовывать сложные условия выборки. Но без подробностей, т.к. обходился без него.Ну значит пора читать учебники. Это описано во всех учебниках, даже в желтых книжках типа "за 21 день для идиотов".

47911Т.к. я за эти несколько дней "что-то менял в базе"(при создании таблиц) я пишу полную инфу(на какой базе щас делаю тесты) ниже(чтобы была исчерпывающая инфа по вопросу, для которого я эту тему и создал).
Вот что создаёт базу(SQL запрос в SQLite3):Забыл первичные ключи задать. И перейди уже на английский, сколько ты еще собираешься себе глаза ломать?

47911$DOn_KOLOHKu - место, где я комментируя строку - отменяю создание колонок-атрибутов у таблицы.Это совершенно не нужно. У тебя уже есть нормализованная структура. Ну так и пользуйся ею.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39502634
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl47911Сер. А "k.criteria_for_KATEGOPuu = 'моя крутая категория'" годится, если я правильно понимаю и меня не обманывает мой мозг: годиться для 1 категории?Да. k.HAZBAHuE = 'моя крутая категория' это выборка одной строки.
Для нескольких будет k.HAZBAHuE in('a', 'b', 'c')

47911Поясните: при обращении T["ta1.ZHA4eHue"](в шарпе, каждый проход цикла имеет массив "T", в нём результат прохода) я получу "аттрибут KOLOHKA1239 товара(значение атрибута)"? Т.е. как получить результат обращения-> конкретный атрибут?C# здесь нет ни грамма. Это все один цельный запрос отсылаемый в СУБД и возвращающий один единственный резалтсет.

47911Про join я слышал\видел как пользуются. Но до сегоднешнего дня я не вникал в него. У меня лишь поверхностное понимание: позволяет реализовывать сложные условия выборки. Но без подробностей, т.к. обходился без него.Ну значит пора читать учебники. Это описано во всех учебниках, даже в желтых книжках типа "за 21 день для идиотов".

47911Т.к. я за эти несколько дней "что-то менял в базе"(при создании таблиц) я пишу полную инфу(на какой базе щас делаю тесты) ниже(чтобы была исчерпывающая инфа по вопросу, для которого я эту тему и создал).
Вот что создаёт базу(SQL запрос в SQLite3):Забыл первичные ключи задать. И перейди уже на английский, сколько ты еще собираешься себе глаза ломать?

47911$DOn_KOLOHKu - место, где я комментируя строку - отменяю создание колонок-атрибутов у таблицы.Это совершенно не нужно. У тебя уже есть нормализованная структура. Ну так и пользуйся ею.

>>C# здесь нет ни грамма. Это все один цельный запрос отсылаемый в СУБД и возвращающий один единственный резалтсет.
>>
А как тогда изменить запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.`id_TOBAPA`, t.`HAZBAHuE`, t.`MODELb`, t.`APTuKyL`, t.`KPATHOCTb`, t.`DOCTynHIOCTb`, t.`KAPTuHKA`, t.`KATEGOPuia`, t.`tcEHA` ,
ta1.ZHA4eHue as  KOLOHKA1239, ta2.ZHA4eHue as KOLOHKA1267, ta3.ZHA4eHue as KOLOHKA1272
FROM KATEGOPuu k
join `TOBAPbl`t on k.`id_KATEGOPuu`=t.`KATEGOPuia`
join `TOBAPbl_ATTPu6yTbl` ta1 on t.`id_TOBAPA` = ta1.`id_TOBAPA`
join `ATTPu6yTbl` a1 on ta1.`id_ATPu6yTA` = a1.`id_ATPu6yTA` and a1.`Tun`= 'KOLOHKA1239'
join `TOBAPbl_ATTPu6yTbl` ta2 on t.`id_TOBAPA` = ta2.`id_TOBAPA`
join `ATTPu6yTbl` a2 on ta2.`id_ATPu6yTA` = a2.`id_ATPu6yTA` and a2.`Tun`= 'KOLOHKA1267'
join `TOBAPbl_ATTPu6yTbl` ta3 on t.`id_TOBAPA` = ta3.`id_TOBAPA`
join `ATTPu6yTbl` a3 on ta3.`id_ATPu6yTA` = a3.`id_ATPu6yTA` and a3.`Tun`= 'KOLOHKA1272'
where k.criteria_for_KATEGOPuu = 'моя крутая категория'


Чтобы он возвращал целый список результатов?
Я попытался:
Код: sql
1.
SELECT t.`id_TOBAPA`, t.`HAZBAHuE`, t.`MODELb`, t.`APTuKyL`, t.`KPATHOCTb`, t.`DOCTynHIOCTb`, t.`KAPTuHKA`, t.`KATEGOPuia`, t.`tcEHA`, ta1.ZHA4eHue as KOLOHKA1239, ta2.ZHA4eHue as KOLOHKA1267, ta3.ZHA4eHue as KOLOHKA1272 FROM `KATEGOPuu` k  join `TOBAPbl` t on '64'= t.`PAZDEL` join `TOBAPbl_ATTPu6yTbl` ta1 on t.`id_TOBAPA` = ta1.`id_TOBAPA` join `TOBAPbl_ATTPu6yTbl` a1 on ta1.`id_ATPu6yTA` = a1.`id_ATPu6yTA` and a1.`id_ATPu6yTA`= '1239' join `TOBAPbl_ATTPu6yTbl` ta2 on t.`id_TOBAPA` = ta2.`id_TOBAPA` join `TOBAPbl_ATTPu6yTbl` a2 on ta2.`id_ATPu6yTA` = a2.`id_ATPu6yTA` and a2.`id_ATPu6yTA`= '1267' join `TOBAPbl_ATTPu6yTbl` ta3 on t.`id_TOBAPA` = ta3.`id_TOBAPA` join `TOBAPbl_ATTPu6yTbl` a3 on ta3.`id_ATPu6yTA` = a3.`id_ATPu6yTA` and a3.`id_ATPu6yTA`= '1272' LIMIT 0, 2429


(Готовый програмно-сгенерированый запрос) - оно возвращает "2429" одного и того же товара. за 1-3 секунды. Можно это дело как-то ускорить?
Индексы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE UNIQUE INDEX IF NOT EXISTS `uHDEKC_id_TOBAPA` ON `TOBAPbl` (`id_TOBAPA`);
CREATE INDEX IF NOT EXISTS `uHDEKC_KATEGOPuia` ON `TOBAPbl` (`KATEGOPuia`);
CREATE INDEX IF NOT EXISTS `uHDEKC_PAZDEL` ON `TOBAPbl` (`PAZDEL`);
CREATE UNIQUE INDEX IF NOT EXISTS `uHDEKC_id_KATEGOPuu` ON `KATEGOPuu` (`id_KATEGOPuu`);
CREATE UNIQUE INDEX IF NOT EXISTS `uHDEKC_id_ATPu6yTA` ON `ATTPu6yTbl` (`id_ATPu6yTA`);
CREATE INDEX IF NOT EXISTS `uHDEKC_T_id_ATPu6yTA` ON `TOBAPbl_ATTPu6yTbl` (`id_ATPu6yTA`);
CREATE INDEX IF NOT EXISTS `uHDEKC_T_id_TOBAPA` ON `TOBAPbl_ATTPu6yTbl` (`id_TOBAPA`);


"INTEGER PRIMARY KEY ASC" тоже расставлены.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39502636
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
47911,

>>оно возвращает "2429" одного и того же товара.
>>
в смысле "как изменить запрос, чтобы он возвращал список товаров, у которых `PAZDEL`='X'"?
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39502808
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитай учебник:
http://www.sql.ru/docs/sql/u_sql/

Воспользуйся любой SQLite утилитой для тренировки. Не своей программой, а внешней утилитой. Как почувствуешь что все запросы можно сделать из этой сторонней утилиты, тогда вернешься к C#. Пока оно тебе мешает.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39502842
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПрочитай учебник:
http://www.sql.ru/docs/sql/u_sql/

Воспользуйся любой SQLite утилитой для тренировки. Не своей программой, а внешней утилитой. Как почувствуешь что все запросы можно сделать из этой сторонней утилиты, тогда вернешься к C#. Пока оно тебе мешает.
За ссылку благодарю. Некоторые вещи проясняться начали.
Но мне не понятно: почему запрос с join пишется без "LEFT\RIGHT" и т.д.? И почему он выдаёт 1 результат?(ищет 1 товар)
Я просмотрел через поиск слова join то, что по ссылке - вообще нет инфы(я конечно понимаю: есть другие источники, но в них с "доп. словом" используется этот оператор. А примера с "join" без 2 слова - не нашёл, и, как следствие, объяснения тоже).

Программу для тестов использую: "DB Browser for SQLite". С ней действительно удобнее.


П.с.: мне вообще это ради одного места надо: вывести список максимально быстро(эта тема об этой проблеме). Всё остальное - уже сделано.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39502937
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
47911Но мне не понятно: почему запрос с join пишется без "LEFT\RIGHT" и т.д.?Потому что это разные типы связывания: запрос с просто JOIN это полное связывание, а LEFT/RIGHT [OUTER] JOIN это "внешнее" связывание (все совпадающие плюс те для которых не нашлось совпадений). В первой книге Грабера они кажется не рассмотрены вообще.

47911 И почему он выдаёт 1 результат?(ищет 1 товар)А почему он должен выдавать несколько?

47911Я просмотрел через поиск слова join то, что по ссылке - вообще нет инфы(я конечно понимаю: есть другие источники, но в них с "доп. словом" используется этот оператор. А примера с "join" без 2 слова - не нашёл, и, как следствие, объяснения тоже).ээээ... да. Грабер писал о более раннем варианте SQL. Ключевое слово JOIN ввели в диалекте SQL-92. Надо брать более свежей учебник. Но начинать лучше с Грабера - он самый понятный хоть и частично устаревший.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39502951
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl47911Но мне не понятно: почему запрос с join пишется без "LEFT\RIGHT" и т.д.?Потому что это разные типы связывания: запрос с просто JOIN это полное связывание, а LEFT/RIGHT [OUTER] JOIN это "внешнее" связывание (все совпадающие плюс те для которых не нашлось совпадений). В первой книге Грабера они кажется не рассмотрены вообще.

47911 И почему он выдаёт 1 результат?(ищет 1 товар)А почему он должен выдавать несколько?

47911Я просмотрел через поиск слова join то, что по ссылке - вообще нет инфы(я конечно понимаю: есть другие источники, но в них с "доп. словом" используется этот оператор. А примера с "join" без 2 слова - не нашёл, и, как следствие, объяснения тоже).ээээ... да. Грабер писал о более раннем варианте SQL. Ключевое слово JOIN ввели в диалекте SQL-92. Надо брать более свежей учебник. Но начинать лучше с Грабера - он самый понятный хоть и частично устаревший.
Получается: любое связывание - выдаёт 1 результат? Такое не подходит. . . Чую я: зря теряю время. . .
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39503007
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
47911Получается: любое связывание - выдаёт 1 результат?Любой отбор (оператор select) выдаёт один результат.
А вот количество строк (рядов) этого результата зависит и от формы и параметров отбора. А ещё - от данных, на которых выполняется отбор.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39503166
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Ок. Пошаманил, почитал кое-чего. Вышло:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t.`id_TOBAPA`, t.`HAZBAHuE`, t.`MODELb`, t.`APTuKyL`, t.`KPATHOCTb`, t.`DOCTynHIOCTb`, t.`KAPTuHKA`, t.`KATEGOPuia`, t.`tcEHA`, 
ta1.ZHA4eHue as KOLOHKA1239, ta2.ZHA4eHue as KOLOHKA1267, ta3.ZHA4eHue as KOLOHKA1272 FROM `TOBAPbl` t  
join `TOBAPbl_ATTPu6yTbl` ta1 on t.`id_TOBAPA` = ta1.`id_TOBAPA` and ta1.`id_ATPu6yTA`= '1239' 
join `TOBAPbl_ATTPu6yTbl` ta2 on t.`id_TOBAPA` = ta2.`id_TOBAPA` and ta2.`id_ATPu6yTA`= '1267' 
join `TOBAPbl_ATTPu6yTbl` ta3 on t.`id_TOBAPA` = ta3.`id_TOBAPA` and ta3.`id_ATPu6yTA`= '1272' 
WHERE t.`PAZDEL`='64' LIMIT 0, 2429


Теперь оно выдаёт список товаров из раздела 64. Только проблема: время выполнение варьируется от 4 до 10 секунд. Довольно жирно... Это самый мелкий(по количеству товаров) вариант. Как его оптимизировать так, чтобы было "минимальное время на выполнения"? 0 до 2429 - это ~15000 товаров выполняющихся в 6 потоков(запрос в базу на количество, и деление "количества товаров" на "Количество процессоров"). А планируется 1 000 000. Как ускорить?
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39503167
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В посте номер 20707422 приведена строение базы, в спойлере.
...
Рейтинг: 0 / 0
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
    #39503640
47911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*там всего 560 000 товаров(в базе). А в разделе - порядка 15000 всего. А запрашивается в приведённом запросе: 2429 штук.*
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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