Lastige query?
Ik heb een table page_id ,position en session_id
Nu wil ik filteren op page_id, maar ook op aantal posities(rijen) per sessie.
Nu lijkt dit eenvoudig, maar voor elke positie wordt een nieuwe regel gemaakt.
page_id position session_id
3 1 1
4 2 1
5 3 1
5 1 2
6 1 3
In dit voorbeeld bestaat sessie 1 uit drie posities (rie rijen lang) page_id 3 komt voor in 1 van deze rijen.
Nu wil ik filteren op page_id=3, want deze komt in sessie 1 voor en aantal posities = 3 met uitkomst sessie 1.
ik wil dit liefst in 1 qeury oplossen, wanneer mogelijk.
Ik hoop dat ik mijn vraagstuk duidelijk verwoord heb.
Zoiets?
SELECT session_id,count(session_id) AS count FROM vb_table GROUP BY session_id HAVING count = 3
SELECT session_id FROM vb_table WHERE page_id = 3
Misschien is het dan duidelijker ;)
Quote:
Nu wil ik filteren op page_id=3 ...
hieruit denk ik dat je deze query bedoelt:
SELECT * FROM table WHERE session_id = 1 AND page_id = 3
Maar, wat zeg jij daar nog allemaal?!?
Quote:
... , want deze komt in sessie 1 voor en aantal posities = 3 met uitkomst sessie 1.
Verklaar dat nog eens duidelijker aub..
Ik zie maar 1 positie voor pagina 3 in sessie 1 en niet 3 posities :-S
Gewijzigd op 01/01/1970 01:00:00 door Hipska BE
session_id 1 bestaat uit drie posities, want session_id 1 komt 3x voor, dat wil zeggen drie rijen, met session_id 1, dus drie posities.
In 1 van die rijen komt page_id 3 voor, dus page_id 3 komt in de session_id 1 voor.
Ik wil dus eigenlijk een query die naar een getal zoekt in de kolom page_id en het totaal aantal rijen telt met het bijbehorende session_id.
Dit is niet slim :) Je moet nooit de naam count gaan gebruiken omdat het ook een (my)SQL functie is :)
Gewijzigd op 01/01/1970 01:00:00 door Jacco Engel
"count(session_id) AS count"
Dan nog is "AS count" geen goed plan :)
Quote:
Ik denk dat je query dan zoiets zal worden?Ik wil dus eigenlijk een query die naar een getal zoekt in de kolom page_id en het totaal aantal rijen telt met het bijbehorende session_id.
Dan komt er overal bij aantal als resultaat 1 uit...
Coen schreef op 18.12.2007 11:12:
Dat is logisch, dat had ik je van te voren al wel kunnen zeggen. Je kunt geen groepen aanmaken, per groep het aantal records tellen, en dan een detail van 1 enkel record opvragen. Er is geen andere oplossing dan voor de details een andere query op te stellen.Zo simpel is het helaas niet.
Dan komt er overal bij aantal als resultaat 1 uit...
Dan komt er overal bij aantal als resultaat 1 uit...
Ook niet als MySQL wel lukraak resultaten gaat verzinnen met onmogelijke GROUP BY-stellingen...
In een tabel sla ik elke keer een page_id en een position op en een session_id, elke sessie heeft een session_id.
De position geeft aan waar in het path de pagina zich bevindt.
page_id position session_id
1 1 1
2 2 1
3 3 1
1 1 2
2 2 2
3 3 2
In dit voorbeeld zijn er twee bezoeken(sessies) geweest, allebei de gebruikers hebben het zelfde pad afgelegd. namelijk pagina 1-> pagina 2 -> pagina 3.
De positie begint bij elke nieuwe sessie opnieuw bij 1.
Nu wil ik filteren elk pad waar pagina 3 voor komt, maar ik wil alleen de paden die langer zijn dan bijvoobeeld 2 pagina's.
In dit voorbeeld zijn dit allebei de sessies 1 en 2, want deze zijn beide langer dan 2(count(session_id)) en bevatten beide pagina 3, in één van de rijen.
Dit wil ik in 1 qeury....
Ook niet als MySQL wel lukraak resultaten gaat verzinnen met onmogelijke GROUP BY-stellingen...
</quote>
Ok, bedankt,
Hoe stel ik het dan op in twee losse qeury's?
Gewijzigd op 01/01/1970 01:00:00 door Pelckie
Blanche schreef op 18.12.2007 12:50:
Wat je dus wilt is alle rijen selecteren met het session_id waarvan er minimaal 3 voorkomen en waarvan er minimaal 1 gekoppeld is aan page_id 3. Oftewel, ik voel 2 subqueries:
Perfect, Dat is precies wat ik bedoelde. Alleen al knap dat je snapte wat ik wilde en dan ook nog de goede oplossing, geniaal man!
Ik heb alleen even van ORDER BY -> GROUP BY gemaakt, omdat ik als resultaat alleen het betreffende session_id nodig heb.
Heel erg bedankt!
Coen schreef op 18.12.2007 13:27:
Ho! Stop!Ik heb alleen even van ORDER BY -> GROUP BY gemaakt, omdat ik als resultaat alleen het betreffende session_id nodig heb.
Dat kan dus niet. Daar een een GROUP BY helemaal niet voor bedoeld! Als je enkel het betreffende session_id nodig hebt, heb je aan deze query voldoende:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT session_id
FROM tabel
WHERE page_id = 3
AND session_id IN (
SELECT session_id
FROM tabel
GROUP BY session_id
HAVING COUNT(session_id) > 2
)
FROM tabel
WHERE page_id = 3
AND session_id IN (
SELECT session_id
FROM tabel
GROUP BY session_id
HAVING COUNT(session_id) > 2
)
ps. Lees ook eens deze tutorial:
GROUP BY: Het juiste gebruik ervan
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Zo is ie precies goed en bedankt voor de link, ik vat hem haha... me nub
Coen schreef op 18.12.2007 13:27:
Dit mag je lezen als:Ik heb alleen even van ORDER BY -> GROUP BY gemaakt, omdat ik als resultaat alleen het betreffende session_id nodig heb.
Quote:
Ik heb van een koe een varken gemaakt.
Heel knap, maar dat gaat dus niet.
Zie verder de tutorial die Blanche je reeds heeft gegeven en onthoudt dat MySQL standaard fout, heel erg fout, omgaat met GROUP BY en vele andere database-toepassingen. Zie deze tutorial hoe je MySQL zo kunt instellen dat MySQL ietsjes veiliger wordt, zich ietsjes beter gaat gedragen. Desondanks blijft MySQL onbetrouwbaar, controleer jouw queries dus dubbel en dwars!
Gewijzigd op 01/01/1970 01:00:00 door Pelckie
Coen schreef op 18.12.2007 13:49:
Nope, dat is het hele grote probleem van MySQL. Als je queries laat uitvoeren die eigenlijk helemaal niet kunnen, gaat MySQL willekeurige resultaten teruggeven in plaats van een nette foutmelding.Oke, bedankt voor de tip. Ik ging er blind vanuit dat wanneer die het slikt dat het goed is, haha niet dus.
In STRICT mode heeft MySQL daar gelukkig al minder last van, maar beter is het nog om MySQL helemaal te vergeten en met een andere database (zoals bijvoorbeeld postgreSQL) te gaan werken.