Gebruikers kunnen posts maken en die worden opgeslaan in wp_posts. Gebruikers kunnen daarna ook posts een rating geven, die rating dan in de tabel wp_rating.
Vereenvoudigde versie van de tabellen:
Tabel wp_posts
postId
userid
Tabel wp_rating
rating_postid
rating_userid
Nu wil ik alle posts krijgen waarop de ingelogde gebruiker nog geen rating heeft gegeven.
Dat heb ik geprobeerd met de volgende query (tijdens het testen gebruik ik id 4 als userid):
Maar dan krijg ik niet de posts die nog geen rating gekregen hebben. En als een andere gebruiker een post al gerate heeft en deze gebruiker nog niet dan komt hij ook nog steeds voor in de lijst.Code:SELECT wposts.* FROM wp_posts wposts, wp_ratings wratings WHERE wratings.rating_userid NOT IN ('4' ) AND wposts.ID = wratings.rating_postid AND wposts.post_type = 'post'
Ik wil dus iets gewoon alle posts krijgen behalve die waarvan er een rij in de wp_rating tabel zit met rating_userid=4
Iemand die mij hierbij kan helpen?
- Alle posts tonen waarop een gebruiker nog geen rating heeft gedaan
-
20-08-2014, 19:58 #1
- Berichten
- 97
- Lid sinds
- 17 Jaar
Alle posts tonen waarop een gebruiker nog geen rating heeft gedaan
-
-
20-08-2014, 20:59 #2
- Berichten
- 153
- Lid sinds
- 14 Jaar
Re: Alle posts tonen waarop een gebruiker nog geen rating heeft gedaan
Idealiter wil je een mooie duidelijke query, iets als:
SELECT * FROM wp_posts P WHERE P.postId NOT IN (SELECT DISTINCT R.postId FROM wp_ratings R WHERE R.userId = 4)
Echter, dat wordt door MySQL onterecht gekwalificieerd als een DEPENDENT_SUBQUERY en is dus zo snel als een baggerpraam.
Minder leesbaar, maar sneller is dus:
SELECT DISTINCT P.postId, ... FROM wp_posts P LEFT OUTER JOIN wp_ratings R ON P.postId = R.postId WHERE R.userId <> 4
-
20-08-2014, 22:28 #3
- Berichten
- 97
- Lid sinds
- 17 Jaar
Re: Alle posts tonen waarop een gebruiker nog geen rating heeft gedaan
Bedankt voor de hulp! Maar dit geeft nog steeds hetzelfde resultaat.. Posts zonder rating worden niet getoond en posts die door gebruiker 4 gerate zijn worden toch nog getoond als ze door een andere gebruiker gerate werden, omdat je dan bv een rij hebt in ratings van gebruiker 1 en van gebruiker 4.
-
21-08-2014, 08:13 #4
- Berichten
- 153
- Lid sinds
- 14 Jaar
Re: Alle posts tonen waarop een gebruiker nog geen rating heeft gedaan
Ik denk dat ik je niet goed begrepen heb, maar wat je dus wilt is "alle posts" MINUS "die posts waar user 4 op gereageerd heeft"
De queries moeten dan worden:
SELECT * FROM wp_posts P WHERE P.postId NOT IN (SELECT DISTINCT R.postId FROM wp_ratings R)
SELECT DISTINCT P.postId, ... FROM wp_posts P LEFT OUTER JOIN wp_ratings R ON P.postId = R.postId GROUP BY P.postId HAVING SUM(R.id) > 0
De laatste weet ik niet helemaal zeker of dat zo mag, maar iets in deze strekking zou moeten werken. Anders moet je me even een schema en wat data aanleveren, dan piel ik er even op. Want zo blind queryen blijft lastig
-
21-08-2014, 09:05 #5
- Berichten
- 153
- Lid sinds
- 14 Jaar
Re: Alle posts tonen waarop een gebruiker nog geen rating heeft gedaan
Oke, ik mag mijn post niet meer editen, dus dan maar even overnieuw, nu met koffie...
---
Ik denk dat ik je niet goed begrepen heb, maar wat je dus wilt is "alle posts" MINUS "die posts waar user 4 op gereageerd heeft"? De eerste query is dan volgens mij sowieso goed:
SELECT * FROM wp_posts P WHERE P.postId NOT IN (SELECT DISTINCT R.postId FROM wp_ratings R WHERE R.userId = 4)
De tweede heb ik nog even op zitten pielen, maar met een left outer, krijg je sowieso alle posts minimaal één keer en evt vaker als er meerdere ratings zijn. Vervolgens filter je die ratings op waar óf user 4 óf niemand gereageerd heeft. Door te groeperen en te tellen over het id, vallen alle rijen met een NULL er weer uit:
SELECT DISTINCT P.postId, ... FROM wp_posts P LEFT OUTER JOIN wp_ratings R ON P.postId = R.postId WHERE (R.userId = 4 OR R.userID IS NULL) GROUP BY P.postId HAVING SUM(R.id) > 0
De laatste weet ik niet helemaal zeker of dat zo mag, maar iets in deze strekking zou moeten werken. Anders moet je me even een schema en wat data aanleveren, dan piel ik er even op. Want zo blind queryen blijft lastig
-
21-08-2014, 09:23 #6
- Berichten
- 97
- Lid sinds
- 17 Jaar
Re: Alle posts tonen waarop een gebruiker nog geen rating heeft gedaan
SELECT * FROM wp_posts P WHERE P.postId NOT IN (SELECT DISTINCT R.postId FROM wp_ratings R WHERE R.userId = 4)
Deze werkt perfect! Heel erg bedankt voor de hulp :)
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic