[PHP/MySQL] Query help

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ultimasnake
  • Registratie: Oktober 2002
  • Laatst online: 03-09 08:01
Momenteel ben ik aan het stoeien met een query waar ik zelf niet meer zo snel uit kom ook niet met de manual... het is de bedoeling fotos uit een album te halen, te laten zien hoeveel comments erin zitten en ook daarop te kunnen sorteren! de query gaat als volgt

SELECT
fotos.*,
album.title AS title,
album.directory AS dir,
album.date AS date,
COUNT(comments.id)
FROM
foto_fotos AS fotos,
foto_album AS album,
foto_comments AS comments
WHERE
fotos.albumid = 73
AND
album.id =73
AND
comments.fotoid = fotos.id
GROUP BY
comments.id
ORDER BY
fotos.pos ASC
LIMIT 0,20

wat hij doet is dus half goed.. hij laat nu alleen items zien waar WEL een topic in staat zie hier
http://www.ultimasoftware...view=fotoindex&albumid=73

maar hoe laat ik hem ook diegene zien ZONDER comments?

chips stomme enter knop... momentje even netjes maken

[ Voor 40% gewijzigd door ultimasnake op 21-07-2005 23:45 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Kijk eens naar left joins. Daarmee kun je tables joinen, waarbij je altijd de resultaten van 1 tabel terugkrijgt, onafhankelijk of er ook iets bijpast van een andere rij.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Outer joins inderdaad. :)

Kun je trouwens je code in het vervolg tussen [code]-tags zetten? Als je [code=sql] gebruikt, dan wordt je code zelfs gehighlight. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ultimasnake
  • Registratie: Oktober 2002
  • Laatst online: 03-09 08:01
ah ok... cool.. sorry had de first post ding gelezen maar vond er niets over... zal dus voortaan het tussend code tags zetten

outerjoins of leftjoins..helemaal vergeten :$

Acties:
  • 0 Henk 'm!

  • ultimasnake
  • Registratie: Oktober 2002
  • Laatst online: 03-09 08:01
Ok nog 1 keer heb ik jullie hulp nodig.. heb nu alweer zoveel gekut dat ik er nu weer niet uit kom :S

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
  fotos.*, 
  album.title AS title, 
  album.directory AS dir, 
  album.date AS date 
FROM 
  foto_fotos AS fotos, 
  foto_album AS album 
LEFT JOIN 
  foto_comments AS comments ON comments.fotoid = fotos.id 
WHERE 
  fotos.albumid = 73 
AND 
  album.id =73 LIMIT 0,20 


wat ik nu wil doen is een count op comments zodat ik het aantal comments krijg te zien. maar een count moet samen met een group, maar als ik die group neer zet (na de where) zoals ik normaal doe ben ik weer terug bij af waardoor ik weer alleen fotos met comments krijg.. de mysql site helpt me er ook niet echt veel bij :S

[ Voor 4% gewijzigd door ultimasnake op 22-07-2005 11:29 ]


Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Maar waar group je dan op?

Het idee van GROUP BY is dat je de unieke combinatie krijgt van alle velden in de GROUP BY "clause".

Een voorbeeld:
SQL:
1
2
3
4
SELECT *
FROM clients, sales
WHERE sales.clientID = clients.clientID
GROUP BY clients.clientID, sales.productID

Dit geeft dus alle unieke combinaties van clienten en producten. Het is wellicht een beetje brak voorbeeld (zo uit de losse pols), maar stel dat in de tabel sales een combinatie wordt gemaakt tussen een (derde) product tabel en de clienten-tabel, dan krijg je met deze query dus alle unieke combinaties van clienten en producten. Wanneer een client dus 1 product verscheidene keren heeft gekocht, komt hij toch maar een keer naar voren.

Wanneer je alleen zou groeperen op clients.clientID, dan krijg je dus alle clienten sowieso maar 1 keer, onafhankelijk van welke producten ze hebben gekocht. Wanneer je alleen zou groeperen op sales.productID, dan krijg je slechts alle producten 1 keer, los van door hoeveel clienten ze zijn besteld.

Wellicht geeft dit wat meer duidelijkheid over de GROUP BY functionaliteit?

In jouw geval zou je dus volgens mij kunnen zetten:
SQL:
1
GROUP BY fotos.fotoid

[ Voor 6% gewijzigd door gvanh op 22-07-2005 11:54 . Reden: concreet geval neergezet ]


Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 15:37

momania

iPhone 30! Bam!

SQL:
1
2
3
4
WHERE 
  fotos.albumid = 73 
AND 
  album.id =73

Is wel een beetje dubbel wat je daar doet ;)

Dit is genoeg:
SQL:
1
2
3
4
5
6
7
FROM
 foto_album AS album,
 foto_fotos AS fotos
LEFT JOIN
 foto_comments AS comments ON comments.fotoid = fotos.id
WHERE
 album.id = 73 AND album.id = fotos.albumid
:)

Neem je whisky mee, is het te weinig... *zucht*


Acties:
  • 0 Henk 'm!

  • ultimasnake
  • Registratie: Oktober 2002
  • Laatst online: 03-09 08:01
gvanh schreef op vrijdag 22 juli 2005 @ 11:51:
Maar waar group je dan op?

Het idee van GROUP BY is dat je de unieke combinatie krijgt van alle velden in de GROUP BY "clause".

Een voorbeeld:
[
SQL:
1
GROUP BY fotos.fotoid
oooh w8 ships.. ik dacht altijd dat een group by dus statisch moest zijn aan de table waar je een count in deed :|...

:o dit maakt het nu zo langzamer hand VEEL duidelijker... zo misschien nog een vraag maar eerst weer verder proberen

Acties:
  • 0 Henk 'm!

  • ultimasnake
  • Registratie: Oktober 2002
  • Laatst online: 03-09 08:01
nou het is gelukt guys. dit is mijn final query

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT 
  fotos.*, 
  album.title AS title, 
  album.directory AS dir, 
  album.date AS date, 
  count(comments.id) AS commentCount, 
  SUM(vote) AS votes, 
  COUNT(vote) AS nrVotes 
FROM 
  foto_fotos AS fotos, 
  foto_album AS album 
LEFT JOIN 
  foto_comments AS comments ON comments.fotoid = fotos.id 
LEFT JOIN 
  foto_vote AS vote ON vote.fotoid = fotos.id 
WHERE 
  fotos.albumid = album.id 
AND 
  album.id =73 
GROUP BY 
  fotos.id 
LIMIT 
  20,20


Als het goed is moet dit allemaal gaan voldoen ;) dank jullie allen _/-\o_
Pagina: 1