Avatar billede supermand69 Nybegynder
26. juli 2004 - 00:52 Der er 12 kommentarer og
1 løsning

måske join

Jeg har en table som ser således ud:

id | reply_id
-------------
1 | 0
2 | 0
3 | 2
4 | 2
5 | 4
6 } 1
7 | 4
...

Hvordan kan man lave en query der tager id og det samlede antal hvor id'en forekommer i reply_id?

eks. for id=4
4 | 2

id=4 forekommer 2 gange i reply_id
Avatar billede erikjacobsen Ekspert
26. juli 2004 - 00:58 #1
select reply_id,count(*) as antal from dintabel group by reply_id
eller
select reply_id,count(*) as antal from dintabel where reply_id='4' group by reply_id

...måske ikke helt det du ønsker
Avatar billede supermand69 Nybegynder
26. juli 2004 - 01:04 #2
det er ved at være ret lang tid siden jeg har rodet med MySQL, så skal lige have genopfrisket det lidt tror jeg ;)

jeg vil have taget et id ud af gangen og så have hvor mange gange hvert id forekommer i reply_id
Avatar billede supermand69 Nybegynder
26. juli 2004 - 01:05 #3
eks.
while(min query) {
echo $row['id'];
echo $row['antal'];
}
Avatar billede spideren Nybegynder
26. juli 2004 - 11:13 #4
select reply_id, (select count(reply_ip) from <table> where reply_id = eTable.reply_id) from <table> as eTable group by reply_id
Avatar billede erikjacobsen Ekspert
26. juli 2004 - 11:18 #5
Jeg forstår ikke præcis hvilket resultat du skal have ud.
Avatar billede supermand69 Nybegynder
26. juli 2004 - 12:27 #6
SELECT id, (SELECT count(reply_id) FROM $DB.$table WHERE reply_id=$DB.$table.id)
FROM $DB.$table
WHERE reply_id=0
GROUP BY id

jeg synes ikke at kunne få det til at virke??
Avatar billede supermand69 Nybegynder
26. juli 2004 - 17:12 #7
jeg har min table:

id | reply_id
-------------
1 | 0
2 | 0
3 | 2
4 | 2
5 | 4
6 | 1
7 | 4

her vil jeg så udtrække et id ad gangen og det antal gange det forekommer i reply_id, så mit udtræk ville i dette tilfælde se således ud:

id | replies
-------------
1 | 1
2 | 2
3 | 0
4 | 2
5 | 0
6 | 0
7 | 0
Avatar billede supermand69 Nybegynder
26. juli 2004 - 17:43 #8
jeg har siddet og rodet lidt med det og er kommet frem til følgende som faktisk virker :) vil så bare lige høre om det er den korrekte måde at gøre det på??

debate1 og debate2 er jo den samme table, så jeg ved ikke om det er korrekt lavet eller der findes en bedre måde at gøre det på?? :)

SELECT debate1.id, COUNT(debate2.reply_id) AS replies
FROM $DB.$table debate1, $DB.$table debate2
WHERE debate1.reply_id=0 && debate1.id=debate2.reply_id
GROUP BY debate1.id
ORDER BY debate1.time DESC
Avatar billede erikjacobsen Ekspert
26. juli 2004 - 18:26 #9
Ja, men brug AND i stedet for && (mere standard)
og count(*) i stedet for COUNT(debate2.reply_id)
(måske lidt hurtigere)

Men nu har du to tabeller? Det er meningen at de skal joines?
Avatar billede supermand69 Nybegynder
26. juli 2004 - 18:35 #10
jamen hvis man skriver count(*) ved den da ikke hvad det er som skal tælles??

ja de skal joines :) men jeg ved ikke om det er den rigtige måde at gøre det på?? for jeg joiner jo fra den samme tabel
Avatar billede supermand69 Nybegynder
26. juli 2004 - 19:06 #11
jeg har bare lige et problem... hvordan får jeg også trukket de id ud som ikke har nogle replies?? den udtrækker kun dem som har nogle replies?!
Avatar billede proaccess Nybegynder
27. juli 2004 - 07:04 #12
Hej Supermand!

Når du bruger GROUP BY, så grupperes resultatet (så du får een af hver), med mulighed for at summere, optælle osv. på andre felter...

Når du bruger:
SELECT reply_id, COUNT(*) AS replies
FROM $DB.$table
GROUP BY reply_id

vil du således få:
replyid | replies
  0    |  2
  1    |  1
  2    |  2
  4    |  2

som netop er indholdet af din tabel!

Hvis du vil have de tomme med, så må du enten lave en tabel med alle de muligheder du vil have (fx. 0-99) eller fylde dem på ved ekstern programmering, hvor du så løber dit resultat igennem række for række, og så skriver 0, for de rækker, som ikke har nogen værdi.

Du kan jo prøve at lave en tabel kaldet "tal" med en kolonne "id" og fyld alle tal fra 0 til 99 i den.
Derefter kan du bruge:

SELECT tal.id, COUNT(*) AS replies
FROM tal LEFT JOIN $DB.$table ON tal.id = $DB$.table.reply_id
GROUP BY tal.id
Avatar billede supermand69 Nybegynder
27. juli 2004 - 20:08 #13
SELECT debate.id, debate.subject, debate.time, COUNT(debate2.reply_id) AS replies, user.name
FROM $DB.$table debate, $DB.user user
LEFT JOIN $DB.$table debate2 ON debate.id=debate2.reply_id
WHERE debate.user_id=user.id && debate.reply_id=0
GROUP BY debate.id
ORDER BY debate.time DESC

Her er min query og den virker! :)

Man bliver nød til at sætte noget i COUNT() ellers får man ikke det rigtige resultat i replies
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester