Moi,
Elikkä hakua olen tekemässä pieneen websoftaan, ja eteen tuli ongelma checkboxien kanssa. Käyttäjällä pitäisi siis olla mahdollisuus filtteröidä hakua checkboxien avulla. En nyt kuitenkaan saa tuota toimimaan. Lähinnä ongelmia tuottaa tuo MySQL hakulausekkeen tekeminen.
Tämä ei tuota yhtää vastausta:
select DISTINCT p.id, p.name FROM paper p, paper_bleaching pb WHERE ((pb.paper_id = p.id) AND ((pb.bleaching_id = 1) AND pb.bleaching_id = 2))
Tämä taas hakee ihan oikein:
select DISTINCT p.id, p.name FROM paper p, paper_bleaching pb WHERE ((pb.paper_id = p.id) AND ((pb.bleaching_id = 1) OR pb.bleaching_id = 2))
Voisiko joku kertoa siis oikean tavan lisätä tuo AND tuohon WHERE lauseeseen, kiitos.
Tietenkään tuo ensimmäinen ei toimi, kun vaatimuksena on, että
((pb.bleaching_id = 1) AND pb.bleaching_id = 2))
Eli käytännössä, ton pb.bleaching_id:n pitäisi olla samaan aikaan sekä 1, että 2.
Ilmeisesti siis ajattelit lausetta päässä "halutaan tuloksia ehdoilla 1 ja 2", mutta tällöin ohjelmoitaessa pitää kayttää tai ehtoa.
Kiitos vastauksista!
Ongelmanahan on se, että tuloksen pitäisi täyttää kummmatkin ehdot. Tuo OR -vaihtoehtohan tuottaa tuloksia, jos edes yksi ehto täyttyy.
Hmm, pitäisikö tuo hakulauseke siis rakentaa jotenkin tyyliin:
WHERE (pb.paper_id = p.id AND pb.bleaching_id = 1) AND (pb.paper_id = p.id AND pb.bleaching_id = 2)
Tämäkään ei näyttäisi toimiva. Vai tajusinko homman ihan väärin? Deadlinen lähestyessä tuntuu näemmä tuo aivotoiminta lakkaavan aika tyystin.
usko jo, että samalla muuttujalla ei voi olla samaan aikaan 2 eri arvoa!!!
pb.bleaching_id voi olla joko 1 tai 2, mutta ei samaan aikaan.
Ei tuokaan voi toimia, koska edelleen vaatimuksena on, että paper.id = 1 JA paper.id = 2. Näytätkö koodin, jolla haet tietoa, niin katsotaan miten sen vois ratkaista.
Mulla on tossa tollanen funktio, joka hakee urlista hakukentän filtterit (eli tyyliin category_id/1/grade_id/2/bleaching_1/3/
Tässä kohta, missä puretaan tuo bleaching urlista ja lisätään WHERE lauseeseen:
if (substr($index,0,9) == "bleaching") { $where .= " AND PaperBleaching.paper_id = p.id AND PaperBleaching.bleaching_id = ?"; $where_items[] = $value; $bleaching_set = 1; $vars["filters"]["bleaching"][] = $value; }
Eli tuohon väliin pitäisi keksiä se oikea lause. Muuten haku toimiikin, mutta ongelma on näissä checkboxeissa, kun paperilla voi olla noita bleachingeja monta. Tauluinahan ovat paper, bleaching ja paper_bleaching.
Toivottavasti tuo selvensi tarpeeksi. Lähinnähän en tarvitse siis kuin sen oikean SQL lauseen, jolla voin hakea papereita, joilla on SEKÄ bleaching1 ETTÄ bleaching2. Olen tuota yrittänyt phpmyadmininkin puolella koittanut pyöritellä, mutta en ole onnistunut. Toivottavasti tämä on mahdollista pelkällä WHERE lauseella eikä tarvitse JOIN:ia, koska sitten pitäisi taas kirjottaa uusiksi tuota hakulauseen generointia..
Mason kirjoitti:
Lähinnähän en tarvitse siis kuin sen oikean SQL lauseen, jolla voin hakea papereita, joilla on SEKÄ bleaching1 ETTÄ bleaching2.
Tietääkseni tuohon tarvitset hieman monimutkaisemman SQL-lausekkeen.
Jotakin tähän suuntaan:
SELECT * FROM t1 WHERE a IN (SELECT a FROM t1 WHERE b IN (1, 2) GROUP BY a HAVING COUNT(*) = 2);
Tarkoitatko ehkä, että seuraavasta taulusta pitäisi saada tulokseksi paper_id:t 2 ja 3 mutta ei 1 eikä 4?
paper_id | bleaching_id |
---|---|
1 | 1 |
2 | 1 |
2 | 2 |
3 | 1 |
3 | 2 |
4 | 2 |
Jos tämä on tavoitteesi, sinun täytyy tehdä näennäisesti kahden taulun kysely, vaikka kummassakin on oikeasti sama taulu.
SELECT * FROM taulu AS t1, taulu AS t2 WHERE t1.paper_id = t2.paper_id AND t1.bleaching_id = 1 AND t2.bleaching_id = 2
Jos haet tietoja oikeasti taulusta paper, johon paper_id viittaa, voit käyttää seuraavanlaista kyselyä:
SELECT * FROM paper JOIN taulu AS t1 ON t1.paper_id = paper.id AND t1.bleaching_id = 1 JOIN taulu AS t2 ON t2.paper_id = paper.id AND t2.bleaching_id = 2
Sisäkkäiset kyselyt ovat hitaampi vaihtoehto mutta ehkä aloittelijalle yksinkertaisempi ymmärtää:
SELECT * FROM paper WHERE EXISTS (SELECT * FROM taulu WHERE paper_id = paper.id AND bleaching_id = 1) AND EXISTS (SELECT * FROM taulu WHERE paper_id = paper.id AND bleaching_id = 2)
Edit: trilogin kyselyssä taitaa olla useampikin asia pielessä, tai ainakaan itse en keksi sille järkevää selitystä. :)
Kyllä, tuota juurikin tarkoitin. Kiitoksia vastauksesta! Taidan näin aluksi heittää tuon hitaamman vaihtoehdon sisään, ja sitten joskus jos aikaa riittää (ei riitä) niin vaihtaa tuohon nopeampaan, siihen kun pitänee kirjoittaa tuo PHP:n SQL -kyselyn rakentaminen osittain uusiksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.