Autor | Zpráva | ||
---|---|---|---|
visionic Profil * |
#1 · Zasláno: 2. 2. 2017, 00:38:23
Ahoj,
mám tu problém s výběrem dat z mysql, mám totiž vzhledem recyklaci všechny filtry uložené v jednom sloupečku, tedy bych chtěl selectnout řádky s určitými hodnotami, které chci vyhledat. Dle dat z mysql viz dole. Obsah mysql Produkt id/jmeno/filtr/cena 1/Lenovo MI32/1-1+2-3/3125 2/PC dřevěné/1-1+2-4/1250 3/Mac Air/1-10+2-3/10000 Filtr id/jmeno 1/Výrobce 2/Procesor Pod-filtr id/filtr-id/jmeno 1/1/Lenovo 2/1/Acer 10/1/Aple 3/2/4-jádro 4/2/2-jádro Chci tedy filtrovat výrobce Lenovo. Použiju LIKE '%1-1%' Problém nastává, že mi to logicky veme i ten mac. To já ale nechci. Řešení by mohlo být připojit + do řetězce LIKE '%1-1+%'. Ale co když chci dva filtry? Jak to řešit když nastavuji těch filtrů třeba už deset? Lze použít třeba toto? $_GET[filtr] = 1-1+2-3; $_GET[filtr] = $filtr; $filtr = explode('+', $filtr) $x=0; foreach ($filtr as $key => $value) { $x++; if ($x==1) { $vyhledavac .= "LIKE '%".$value."+%' "; } else { $vyhledavac .= "AND LIKE '%".$value."+%'"; } } $sql = mysql_query("SELECT * blablabla $vyhledavac ORDER BY id DESC"); Bude to fungovat? Odpověď na otázku typu proč si to nevyzkouším, bohužel nejsem doma a nemám k dispozici server na test a zatím jen spekuluju. Díky. |
||
Keeehi Profil |
#2 · Zasláno: 2. 2. 2017, 00:51:33
visionic:
„Řešení by mohlo být připojit + do řetězce LIKE '%1-1+%'.“ Ano, až na to, že za posledním filtrem to plus nemáš, takže filtr na poslední pozici to nenajde. To co navrhuje by použít šlo, ovšem správně je to jinak. Celý soupeček filtr z tabulky produkt vyhodíš a uděláš z něj vazební tabulku se sloupci produkt_id, filtr_id a podfiltr_id |
||
visionic Profil * |
#3 · Zasláno: 2. 2. 2017, 02:30:00
Keeehi:
Tohle mě také napadlo a zdá se to být dobré řešení a dokonce je asi správné, ale narážím zde na problém. Zaškrtnu výrobce - lenovo, procesor - 4 jádra. Dle vazební tabulky načtu dle filtrů obsah. A ejhle ten produkt se mi načetl 2x. Abych vysvětlil situaci. Vazebná tabulka id/product_id/filtr_id/podfiltr_id 1/1/1/1 2/1/2/3 tedy get vypada takto: 1-1 a 2-3 Tak proto to načte dva produkty a proto jsem to chtěl řešit ty filtry na jednom řádku. Samozřejmě asi na to existuje řešení, ale bohužel dál už nevím. |
||
Taps Profil |
#4 · Zasláno: 2. 2. 2017, 06:07:58
Muzes pouzit group by product_id
|
||
Keeehi Profil |
visionic:
Přesně tak, jak píše Taps. A pro určení, že se to má brát jako AND a ne jako OR pak využiješ HAVING COUNT(*) = 2 |
||
Časová prodleva: 5 dní
|
|||
visionic Profil * |
#6 · Zasláno: 7. 2. 2017, 13:37:06
Keeehi:
Ono nestačí toto?: (jsem si vedom, ze chybi cyklus while a spojeni s databazi) SELECT P.jméno AS pjmeno,* from filters F LEFT JOIN product P on F.product_id=P.id WHERE F.filtr_id=$_GET[filtr] AND F.podfiltr_id=$_GET[podfiltr] GROUP BY F.product_id; echo $row[pjmeno]; |
||
Keeehi Profil |
#7 · Zasláno: 7. 2. 2017, 15:00:05
visionic:
Pro jeden filtr možná ano, v prvním dorazu jsi se ale taky ptal na použití více filtrů současně. Když to má být filter na produkty, měl bys tam mít JOIN místo LEFT JOIN
|
||
Časová prodleva: 7 let
|
0