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'))
Toto je SQL, ked vyhladam produkt, ktory ma Cervenu farbu A! Wi-Fi
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
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 *
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 *
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 *
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
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 *
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
Ale nájde to len 1 produkt, ktorý má v databáze nastavený parameter farba na číerna.. takže asi to ten druhý parameter ignoruje, pretože
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
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 *
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 *
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
Co vypíše?
select * from tabulka where ProduktID=488734 and KodParametru=4125887801
ahoj ako sa mas
Profil *
Kajman:
Presne toto:
juriad
Profil
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 *
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
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 *
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
juriad:

No jo, bez group by to opravdu nebude fungovat, jak má :-)
ahoj ako sa mas
Profil *
juriad:
Ď A K U J E M


ďakujem aj všetkým za pmoc a snahu vazim si to :)
ahoj ako sa mas
Profil *
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
HAVING COUNT(distinct KodParametru) = 2
juriad
Profil
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ů.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0