Toon posts:

[SQL] Count icm join probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een sqlquery waar ik niet uitkom. Lijkt me sterk dat ik alleen ben, maar ik kan nergens een passende oplossting vinden.

Steltu ovor: stukken tekst waar dan op gereageerd kan worden. Nu heb ik een join query nodig die 1x dingen als de titel van de tekst en het aantal reacties ophaalt. Ik heb nu dit:
code:
1
2
3
SELECT count(reacties.postid) AS aantal, site.titel as titel FROM reacties 
INNER JOIN site ON site.id=reacties.postid AND site.id=site.id GROUP 
BY site.id ORDER BY site.id DESC LIMIT 5

Maar dan komen dus alleen de teksten te voorschijn waar reacties bij horen. Als count(reacties.postid) == 0, dan wordt die overgeslagen, wat ook logisch is met deze query, maar ik krijg het niet voor mekaar om die teksten zonder reacties ook te laten zien.

Heb de search gebruikt, maar kon daar geen oplossing vinden. In een tutorial op mysql.com leek de oplossing te staan, die onderste query hierzo. Maar ik kan dat niet goed toepassen op mijn database.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Originele titel: "[PHP] Count icm join probleem"

En dit heeft WAT te maken met PHP? Voor zover ik kan zien is het alleen een SQL probleem.

(Titel aangepast.)

Jouw probleem heeft alles te maken met je database model.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Je moet het idd met OUTER joins oplossen, maar als je dat niet kan toepassen, kan het idd zijn dat uw database-model niet echt goed is.

https://fgheysels.github.io/


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
site.id=reacties.postid AND site.id=site.id

Wat is de gedachte hierachter?
a=b en a=a :?

Who is John Galt?


Verwijderd

Topicstarter
Ahh nee, dat klopt idd niet. Dat stukje is ook meer een probeer dingetje. Niet dat het dus werkt.

dit moet dan de 'correcte' versie zijn:
code:
1
2
3
SELECT count(reacties.postid) AS aantal, site.titel as titel FROM reacties 
INNER JOIN site ON site.id=reacties.postid GROUP 
BY site.id ORDER BY site.id DESC LIMIT 5

Maar wat is er dan verkeerd aan mijn database model?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
site:
+--------+-------------+------+-----+---------+----------------+
| Field  | Type   | Null | Key | Default | Extra        |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     |    | PRI | NULL    | auto_increment |
| tijd   | int(10)     | YES  |     | NULL    |         |
| inhoud | blob   | YES  |     | NULL    |          |
| titel  | varchar(70) | YES  |     | NULL    |         |
+--------+-------------+------+-----+---------+----------------+

reacties:
+---------+--------------+------+-----+---------+----------------+
| Field   | Type       | Null | Key | Default | Extra       |
+---------+--------------+------+-----+---------+----------------+
| id    | int(11)   |   | PRI | NULL    | auto_increment |
| postid  | varchar(20)  | YES  |     | NULL    |           |
| bericht | blob       | YES  |     | NULL    |         |
| naam    | varchar(50)  | YES  |     | NULL    |           |
| time    | int(10) | YES  |     | NULL    |            |
+---------+--------------+------+-----+---------+----------------+

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06-09 09:41

gorgi_19

Kruimeltjes zijn weer op :9

Om te beginnen vind ik het wel vreemd dat postid van type varchar is en niet van integer, aangezien je beiden aan elkaar wil koppen. Ook mag dit veld null zijn (een reactie op een bericht, zonder een bericht te hebben?) Referentiele integriteit lijkt het dan ook niet te hebben.

Was een blob niet voor binaire waarden? Een Memo / text-field moet volgens mij ook voldoen

Nog een tip: Als je bezig gaat met datum en tijd, dan kan je als default-waarde vast wel "now()" instellen o.i.d.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
okok, de db is misschien wat ehm.. eenvoudig :). Maar als ik van die postid een int maak, kom ik niet verder. En een INNER OUTER JOIN komt ook niet met het resultaat zoals het zou moeten.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06-09 09:41

gorgi_19

Kruimeltjes zijn weer op :9

Inner outer join? Was het niet een left of right join?

Enfin, bij mij is het wel gelukt...:)
code:
1
2
3
SELECT Count(reacties.ReactieID) AS CountOfReactieID, Post.Titel
FROM Post RIGHT JOIN reacties ON Post.PostID = reacties.PostID
GROUP BY Post.Titel;

Deze werkte; ik heb alleen een iets andere structuur qua database aangehouden (tijd is bijvoorbeeld datum, postid integer, omdat deze anders moeielijk te koppelen is of referentiele integreteit zeer lastig af te dwingen is tussen de PostID van beide tabellen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
tsss.. nou jah, dat werkt bij mij eigenlijk net zo goed als mijn superieure eerste querie. Ik krijg alleen texten waar reacties bij zitten. Als count(reacties) = NULL, wordt de regel niet gesjowed. En ook als ik er dus een RIGHT OUTER JOIN van maak, werkt het niet. *snif*.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06-09 09:41

gorgi_19

Kruimeltjes zijn weer op :9

Tsk.. niet zo cynisch worden.. Daar houdt Gorgi niet van...;)

Een tweede kans:
code:
1
2
3
SELECT Count(reacties.ReactieID) AS CountOfReactieID, Post.Titel
FROM Post LEFT JOIN reacties ON Post.PostID = reacties.PostID
GROUP BY Post.Titel;

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
hmmz, als ik dus de query zo probeer krijg ik alleen maar een knipperende cursor. Als ik het in een php script prop krijg ik een timeout na 30 sec, en als ik dan ipv
code:
1
Post LEFT JOIN reacties

dit doe:
code:
1
reacties LEFT JOIN Post

dan krijg ik hetzelfde idee van de texten die niet worden gesjowed als er geen reacties zijn.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06-09 09:41

gorgi_19

Kruimeltjes zijn weer op :9

Tsja, wat kan ik er op zeggen. Ik heb alleen de wijzigingen doorgevoerd in de tabelstructuur (een paar posts eerder) en de query in MS Access gemaakt.

Ik weet niet waar de verschillen zitten tussen MSAccess SQL en MySQL sql.

Dit is vast anders wel op te zoeken. Enfin, ik heb de db getest en bij mij werkt het correct, geeft de posts goed weer. Eventueel wil je deze db wel sturen per mail.

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1