• Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.

[PHP/MySQL] Вадење податоци од табела според категорија

  • Ја почнал/а темата
  • #1

metahuman

Intern
23 септември 2019
41
22
Имам функција која треба да вади податоци од следнава табела:



- Доколку функцијата getTitles() прими аргумент 1, треба да ги врати сите наслови кои спаѓаат во категоријата 1.
Враќа: Title1, Title2
PHP:
$data = getTitles(1);

- Доколку функцијата getTitles() прими аргумент 2, треба да ги врати сите наслови кои спаѓаат во првите две категории.
Враќа: Title1, Title2, Title3, Title4, Title5
PHP:
$data = getTitles(2);

- Доколку прими аргумент 149, треба да ги врати сите наслови кои спаѓаат во првите 149 категории, и тн.

Како ова да се изведе на елегантен начин, во едно query на пример?
пр. селектирај ги сите наслови од првите $n категории
 

Overdrive

On your way to fame
23 јуни 2010
479
503
Тоа што ти треба е BETWEEN. За getTitles(149) query-то треба да ти изгледа вака:

PHP:
SELECT `title` WHERE `category` BETWEEN 1 AND 149
Останува да одбереш како ќе го генерираш (рачно преку PDO + prepared statements, или со помош на некоја библиотека).
 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
квери во квери. SELECT во SELECT, нешто ко на пример...

SELECT * FROM `tabela` WHERE `category` IN (SELECT DISTINCT `category` FROM `tabela` LIMIT <kolku_sakas_tuka>).

Секако, ова ќе го прајш со PDO

Тоа што ти треба е BETWEEN. За getTitles(149) query-то треба да ти изгледа вака:

PHP:
SELECT `title` WHERE `category` BETWEEN 1 AND 149
Останува да одбереш како ќе го генерираш (рачно преку PDO + prepared statements, или со помош на некоја библиотека).
погрешно го имаш сфатено проблемот. погорното квери е то шо му треба него.
 

Overdrive

On your way to fame
23 јуни 2010
479
503
Мала грешка горе, ама форумов (или Cloudflare) не ми дозволува да го изменам претходното мислење затоа што го интерпретира query-то како обид за напад :)

Како и да е, еве го како слика:

 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
Мала грешка горе, ама форумов (или Cloudflare) не ми дозволува да го изменам претходното мислење затоа што го интерпретира query-то како обид за напад :)

Како и да е, еве го како слика:

кверито нема да ти е 100% функционално од следнава причина. Тргнуваш од претпоставката дека ги има сите категории од 1 до 149, и очекуваш назад 149 категории. но, ако фали некоја категорија, автоматски не вадиш 149, туку помалку.
пример, имаш ид-ња:
1
2
3
5
6
7
ти бираш, пример : between 1 and 5. очекуваш назад 1,2, 3, 4, и 5. со твоето квери, добиваш 1,2,3,5. а правилно е да добиеш: 1,2,3,5,6.
 

Frozen.

Gaining Experience
4 октомври 2015
119
143
квери во квери. SELECT во SELECT, нешто ко на пример...

SELECT * FROM `tabela` WHERE `category` IN (SELECT DISTINCT `category` FROM `tabela` LIMIT <kolku_sakas_tuka>).

Секако, ова ќе го прајш со PDO

погрешно го имаш сфатено проблемот. погорното квери е то шо му треба него.
И двете решенија се валидни се додека не ја избрише некоја од категориите пример втората и добие ново ID поголемо од 150, со тоа што втората пак ќе остане втора по некој друг параметар (реден број)
 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
И двете решенија се валидни се додека не ја избрише некоја од категориите пример втората и добие ново ID поголемо од 150, со тоа што втората пак ќе остане втора по некој друг параметар (реден број)
прочитај го претходниот одговор шо го постирав, има и објаснување зошто моето решение ти е повалидно за проблемот шо го имаш
 

Frozen.

Gaining Experience
4 октомври 2015
119
143
прочитај го претходниот одговор шо го постирав, има и објаснување зошто моето решение ти е повалидно за проблемот шо го имаш
Така е одговорот е точен НО што доколку јас наместам LIMIT 149, а втората категорија ми е со ID 205, со тоа што ќе фали само ID 2 јас пак нема да ги добијам насловите од втората категорија од табелата.

Тука фали дали ПРВИТЕ 149 категории во табелата 'tabela' или пак првите 149 категории од табелата 'category'
 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
Така е одговорот е точен НО што доколку јас наместам LIMIT 149, а втората категорија ми е со ID 205, со тоа што ќе фали само ID 2 јас пак нема да ги добијам насловите од втората категорија од табелата.

Тука фали дали ПРВИТЕ 149 категории во табелата 'tabela' или пак првите 149 категории од табелата 'category'
ако редот со ид=2 имал категорија 2, а си ја сменил после во 205, тогаш кверито треба да ти изгледа:


edit: ping @Fatal1ty_ , CODE тагот пријавува cloudflare грешка

edit2: во subquery-то, додај само ORDER BY `id` пред LIMIT
 
@Frozen. следново квери ти е во случај ако phpmyadmin ти се жали дека MariaDB не поддржува in, limit во сабкверија
 

Frozen.

Gaining Experience
4 октомври 2015
119
143
ако редот со ид=2 имал категорија 2, а си ја сменил после во 205, тогаш кверито треба да ти изгледа:


edit: ping @Fatal1ty_ , CODE тагот пријавува cloudflare грешка

edit2: во subquery-то, додај само ORDER BY `id` пред LIMIT
 
@Frozen. следново квери ти е во случај ако phpmyadmin ти се жали дека MariaDB не поддржува in, limit во сабкверија
Одличен си @spiritBreaker :) инаку досега сум немал проблем со IN со MariaDB така да бев сигурен дека ќе работи.
 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
во принцип, ако имаш едноставен IN, и во него SELECT шо има лимит, MariaDB ќе се буни заради то шо не поддржува LIMIT во вгнезден IN подквери. во тој случај, inner join ти врши работа, само ќе треба да кастираш алиаси на табелите. во тој случај, LIMIT оди во главното квери, а не во подкверито.
 
Последна промена:
  • Ја почнал/а темата
  • #13

metahuman

Intern
23 септември 2019
41
22
ако редот со ид=2 имал категорија 2, а си ја сменил после во 205, тогаш кверито треба да ти изгледа:


edit: ping @Fatal1ty_ , CODE тагот пријавува cloudflare грешка

edit2: во subquery-то, додај само ORDER BY `id` пред LIMIT
 
@Frozen. следново квери ти е во случај ако phpmyadmin ти се жали дека MariaDB не поддржува in, limit во сабкверија
Овде имаш LIMIT 3 и притоа ти вади 3 реда, а не сите редови од првите 3 категории.

Во тие 3 категории може да има и 50 реда (во првата категорија 4 реда, во втора 26 реда, во третата 20 реда).

Еве schema и податоци врз кои може да тестирате.
 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
Овде имаш LIMIT 3 и притоа ти вади 3 реда, а не сите редови од првите 3 категории.

Во тие 3 категории може да има и 50 реда (во првата категорија 4 реда, во втора 26 реда, во третата 20 реда).

Еве schema и податоци врз кои може да тестирате.
ноуп, читај го убаво проблемот. ги сака ПРВИТЕ n редови.
 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
Остај ти @Frozen. што сака, дај кажете некое решение за мојот проблем, јас ја отворив темава. :D
ок, али погоре е даено решение за првите n категории. друга можност е да не си се изјаснил како шо треба за проблемот шо го имаш/сакаш да решиш
 
  • Ја почнал/а темата
  • #17

metahuman

Intern
23 септември 2019
41
22
ок, али погоре е даено решение за првите n категории. друга можност е да не си се изјаснил како шо треба за проблемот шо го имаш/сакаш да решиш
Кое е решението?

Ова query не можам да го извршам, ми дава error дека doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'.
SELECT * FROM `tabela` WHERE `category` IN (SELECT DISTINCT `category` FROM `tabela` LIMIT <kolku_sakas_tuka>).

Ова исто не е решение, бидејќи ова е решение за првите n редови, а не категории.

Засега до овде стигнав ја со решението, ама со две квериња. Едно квери ги вади категориите, а другото ги вади сите редови од претходно извадените категориите. Ако од овие две може да се склопи некое пооптимално решение, пишете.

SELECT category FROM tabela GROUP BY category ORDER BY category LIMIT 2;
SELECT * FROM tabela WHERE category IN (1, 5);
 

spiritBreaker

LaravelMaster
27 октомври 2015
3,018
3,462
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi + 512GB Gigabyte NVME
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
DELL S2721GDF
OS
Windows 10
То значи дека не го поставуваш проблемот како шо треба, па зато се и ваквите одговори. Како и да е, се одјавувам од темата.
 
  • Ја почнал/а темата
  • #19

metahuman

Intern
23 септември 2019
41
22
То значи дека не го поставуваш проблемот како шо треба, па зато се и ваквите одговори. Како и да е, се одјавувам од темата.
Мислам дека добро беше поставен проблемот, и ти добро го сфати според постов, ако не се лажам, ама те збуни Frozen после. :D
Како и да е, се трудев да е што подобро поставен проблемот, ама ете... :/

Сепак, фала за одговорите, ми дадоа некои hints и постепено дојдов до решение на проблемот, со се workaround за таа грешката 'LIMIT & IN/ALL/ANY/SOME subquery'.

Еве го решението, може ќе му користи на некој. Грдо е, ама брка работа.
 

Нови мислења

Последни Теми

Статистика

Теми
43,101
Мислења
838,575
Членови
29,018
Најнов член
dimitar.spiroski
На врв Дно