Autor | Zpráva | ||
---|---|---|---|
ahoj ako sa mas Profil * |
Ahoj,
snazim sa urobit vyhladavanie produktov podla parametrov, no a zlyhal som pri SQL a potrebujem pomoct.. V PHP som si vsetky zvolene hodnoty z formulara parametrov spojil do nasledujuceho SQL prikazu (alebo "ako vyzera SQL"): SELECT * FROM tabulka WHERE ((Hodnota = 'Wi-Fi' AND KodParametru = '1437418133') AND (Hodnota = 'červená' AND KodParametru = '4125887801')) No lenze toto mi nic nenajde, ani v phpmyadmine. Neviem kde moze byt chyba. Produkt ktory je cerveny a ma aj wifi tam urcite je a existuje v databaze. Dakujem za pomoc. Moderátor jenikkozak: Patrně jsi to nepochopil, ale položka jméno slouží k jinému účelu.
|
||
juriad Profil |
Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení položek mající všechny hledané vlastnosti
Určitě ale neexistuje jedna řádka, která má zároveň KodParametru = '1437418133' i '4125887801'. Případně ukaž schéma, tabulku produktů a tabulku s parametry. |
||
Taps Profil |
#3 · Zasláno: 8. 5. 2014, 13:21:45
ahoj ako sa mas:
zkus SELECT * FROM tabulka WHERE ((Hodnota = 'Wi-Fi' AND KodParametru = '1437418133') OR (Hodnota = 'červená' AND KodParametru = '4125887801')) |
||
ahoj ako sa mas Profil * |
#4 · Zasláno: 8. 5. 2014, 13:23:32
juriad:
Precitam si to Taps: OR neni dobre pretoze by to naslo rozdielne produkty, napr. vsetky co maju wi-fi a farby aj cierne, sive atd.. |
||
Taps Profil |
ahoj ako sa mas:
zkus <? SELECT * FROM tabulka WHERE KodParametru in (1437418133, 4125887801) AND Hodnota='červená' OR Hodnota='Wi-fi' ?> |
||
ahoj ako sa mas Profil * |
#6 · Zasláno: 8. 5. 2014, 13:29:37
Teraz mi to vyzerá takto, a nejde mi to, mám MariaDB
SELECT * FROM tabulka WHERE (Hodnota, KodParametru) in (('Wi-Fi','1437418133')) AND (Hodnota, KodParametru) in (('červená','4125887801')) having count(distinct Hodnota, KodParametru) = 2 |
||
juriad Profil |
Taps:
On se snaží najít produkt, ke ketému ve vazební tabulce existují dva záznamy, každý reprezentující jeden z parametrů. SELECT id_produktu FROM tabulka WHERE (Hodnota, KodParametru) in (('Wi-Fi','1437418133'), ('červená','4125887801')) GROUP BY id_produktu HAVING COUNT(distinct Hodnota, KodParametru) = 2 Opravena nadbytečná mezera |
||
ahoj ako sa mas Profil * |
#8 · Zasláno: 8. 5. 2014, 13:44:19 · Upravil/a: ahoj ako sa mas
SELECT id_produktu FROM tabulka WHERE (Hodnota, KodParametru) in (('Wi-Fi','1437418133'), ('červená','4125887801')) GROUP BY ProduktID HAVING COUNT (distinct Hodnota, KodParametru) = 2 LIMIT 0, 25 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'distinct Hodnota, KodParametru) = 2 LIMIT 0, 25' at line 5 to produktID a id_produktu je to isté, a nejde to akoby MariaDB nepoznala HAVING COUNT |
||
juriad Profil |
#9 · Zasláno: 8. 5. 2014, 13:49:07 · Upravil/a: juriad
Mezi COUNT a závorkou nesmí být mezera. Promiň.
A na prvním řádku chceš nahradit id_produktu za ProduktID. Za to se omlouvám. By default, there must be no whitespace between a function name and the parenthesis following it. This helps the MySQL parser distinguish between function calls and references to tables or columns that happen to have the same name as a function. However, spaces around function arguments are permitted. http://dev.mysql.com/doc/refman/5.0/en/functions.html |
||
ahoj ako sa mas Profil * |
#10 · Zasláno: 8. 5. 2014, 14:17:58
Tak tá medzera teda bola chyba, teraz to teda vyzerá takto:
SELECT ProduktID FROM tabulka WHERE (Hodnota, KodParametru) in (('Wi-Fi','1437418133'), ('červená','4125887801')) HAVING COUNT(distinct Hodnota, KodParametru) = 2 v PHPMyAdmin mi to našlo 1 produkt ktorý má Wi-Fi (ale Wi-Fi má oveľa viac produktov) Prosim ešte s týmto mi pomôžte kde môže byť problém |
||
Kajman Profil |
#11 · Zasláno: 8. 5. 2014, 14:19:46
ahoj ako sa mas:
A nemá ten produkt obě barvy? |
||
juriad Profil |
A nenašlo to náhodou produkt, který je jak černý, tak i červený?
|
||
ahoj ako sa mas Profil * |
#13 · Zasláno: 8. 5. 2014, 14:30:20
Kajman, juriad:
Nie, našlo mi to tento produkt (na obrazku su parametre podla ktorych sa vyhladava) |
||
juriad Profil |
Vždyť jo. Produkt číslo 488734 má všechny tyto vlastnosti. Tedy je i červený (není zde vedeno, ale když zrušíš limit, tak jistě bude) a má Wi-Fi.
Nic přece nebrání tomu, aby jeden notebook měl několik barev. |
||
ahoj ako sa mas Profil * |
#15 · Zasláno: 8. 5. 2014, 14:37:58 · Upravil/a: ahoj ako sa mas
juriad:
prepáč, ale je tam napísané že má farbu čiernu, nie červenú, takže nerozumiem.. ano viac produktov je čiernych a červených ale keď do SQL napíšem červený tak to našlo čierny, ja by som potreboval aby to našlo tie zvýraznené spolu, nie buď to alebo to. Limit tam nastavený nieje, je to len SELECT ProduktID FROM tabulka WHERE (Hodnota, KodParametru) in (('Wi-Fi','1437418133'), ('červená','4125887801')) HAVING COUNT(distinct Hodnota, KodParametru) = 2 Produkt 488734 nemá vastnosť že je červený. |
||
Kajman Profil |
#16 · Zasláno: 8. 5. 2014, 15:14:55
Co vypíše?
select * from tabulka where ProduktID=488734 and KodParametru=4125887801 |
||
ahoj ako sa mas Profil * |
#17 · Zasláno: 8. 5. 2014, 15:35:27
Kajman:
Presne toto: |
||
juriad Profil |
#18 · Zasláno: 8. 5. 2014, 15:40:17
Ukaž definici tabulky
tabulka :
SHOW CREATE TABLE tabulka; Nemáš tam nějaké divoké COLLATION? Co vypíše následující dotaz? select * from tabulka where ProduktID=488734 and Hodnota='červená' |
||
ahoj ako sa mas Profil * |
#19 · Zasláno: 8. 5. 2014, 15:48:02
juriad:
To SHOW CREATE TABLE mi vypise ale nie cele, a nedá sa to celé zobraziť, tak som odscreenoval štruktúru: „Co vypíše následující dotaz?“ nevracia mi to nič, pretože tam "červená" nieje, ale čierna, takže ak zmením na čiernu tak mi to nájde to čo vyššie v #17 |
||
Kajman Profil |
#20 · Zasláno: 8. 5. 2014, 19:51:44
ahoj ako sa mas:
Ještě dotaz můžete zkusit přepsat na klasické or místo kratšího row zápisu. SELECT ProduktID FROM tabulka WHERE ( ( Hodnota = 'Wi-Fi' AND KodParametru = '1437418133' ) OR ( Hodnota = 'červená' AND KodParametru = '4125887801' ) ) HAVING Count(DISTINCT Hodnota, KodParametru) = 2 Pokud to stále nebude fungovat, zkusil bych data třeba vyexportovat do nějaké mysql databáze a otestoval tam. V případě, že to tam bude v pořádku, zkuste nachystat nějaký minimalistický příklad struktury a dat, kdy to hledá špatně a reportuje chybu vývojářům MariaDB. |
||
ahoj ako sa mas Profil * |
#21 · Zasláno: 8. 5. 2014, 20:03:16
Kajman:
naozaj dakujem za snahu.. je to stale ten isty vysledok, najde to cierny s wifi.. skusim nejako prehodit mariadb na mysqldb mozno to pojde |
||
juriad Profil |
No to mě ***.
Ono to lze replikovat a dokonce na všech verzích MySQL. http://sqlfiddle.com/#!2/3e947/1 ALE NENÍ TO BUG Prostě se jen chybně kopírujeme. Chybí tam totiž klauzule GROUP BY , která z dotazu tiše zmizela někde kolem [#10].
|
||
Kajman Profil |
#23 · Zasláno: 8. 5. 2014, 20:12:20
juriad:
No jo, bez group by to opravdu nebude fungovat, jak má :-) |
||
ahoj ako sa mas Profil * |
#24 · Zasláno: 8. 5. 2014, 20:27:04 · Upravil/a: ahoj ako sa mas
juriad:
Ď A K U J E M ďakujem aj všetkým za pmoc a snahu vazim si to :) |
||
Časová prodleva: 4 dny
|
|||
ahoj ako sa mas Profil * |
#25 · Zasláno: 12. 5. 2014, 16:25:27
Prišiel som na ďalší problém čo sa týka ešte tejto témy,
a to že mi nevyhľadá produkty, ak je v SQL rovnaký parameter 2 a viac krát Takto vyzerá SQL SELECT ProduktID FROM tabulka WHERE (Hodnota, KodParametru) in (('Wi-Fi','1437418133'), ('červená','4125887801'), ('čierna','4125887801')) GROUP BY ProduktID HAVING COUNT(distinct Hodnota, KodParametru) = 3 Teda malo by to vyhľadať aj čierna aj červená, no nenájde to nič pravdepodobne to hľadá aj čiernu aj červenú v jednom, ako by ste vyriešili tento problém? |
||
Kajman Profil |
#26 · Zasláno: 12. 5. 2014, 18:31:06
HAVING COUNT(distinct KodParametru) = 2 |
||
juriad Profil |
#27 · Zasláno: 12. 5. 2014, 19:46:40
1) Máš dvě skupiny parametrů a z každé chceš splněný alespoň jeden. (máš požadavek na barvu a bezdrátové připojení)
2) Navíc víš, že v rámci skupiny bude mít produkt nejvíše jeden. (červený a černý zároveň asi nebude) Stačí proto COUNT porovnat s počtem skupin parametrů. |
||
Časová prodleva: 10 let
|
0