[PHP/MySQL] Query-probleem, twee tabellen koppelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb twee tabellen voor een website. Eén tabel gebruik ik voor het plaatsen van nieuws, een andere tabel gebruik ik voor het opslaan van comments/reacties op de nieuws-items. In principe werkt alles nu goed.

Echter, ik ben nog nie zo goed in query's moet ik bekennen :).

Wat ik wil?
Als ik met een select-statement alle nieuws-items uit de tabel 'lommers_nieuws' haal, dan wil ik ook graag de count() van de reacties, betreffende het nieuws_item. Deze moeten dus komen uit de tabel 'lommers_nieuws_comments'.

met de volgende query probeer ik dit te realiseren:
code:
1
2
3
4
5
6
7
SELECT n.id
           , n.datum
           , n.titel
           , count( nc.news_id ) 
FROM lommers_nieuws n
        , lommers_nieuws_comments nc
GROUP  BY n.id


Bij deze query komen netjes alle news-items terug, dat werkt dus perfect. Alleen bij de count() krijg ik steeds hetzelfde getal, en wel het getal van het totaal aantal comments op alle niews-items. Wat doe ik verkeerd?

Zie hieronder een overzicht van de twee tabellen.
Afbeeldingslocatie: http://www.lommersonline.com/temp/db_model.GIF

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Je moet eens in een willekeurige SQL tutorial op zoek gaan naar 'JOINS'.

Je haalt nl. data uit 2 verschilllende tabellen, maar je joined die data nergens.
Het gevolg is dat je database-systeem voor ieder record uit tabel 1, ieder record uit tabel 2 gaat gaan ophalen.
Je denkt misschien dat jouw query perfect gaat, maar dat doet hij niet.

code:
1
2
3
SELECT *
FROM tabel1, tabel2
WHERE tabel1.id = tabel2.news_id

of
code:
1
2
3
SELECT * 
FROM tabel1
INNER JOIN tabel2 ON tabel1.id = tabel2.news_id

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Daarnaast moet je ook eens goed kijken naar die GROUP BY clausule die je hebt.
In MySQL zal die wel mooi werken, maar eigenlijk gebruik je ze verkeerd. In ieder ander (deftig) DBMS zal ze nooit werken.
Je moet ieder veld dat in je SELECT list staat, en dat geen aggregated function (SUM, COUNT, ...) is, opnemen in je GROUP BY statement

https://fgheysels.github.io/


Verwijderd

Topicstarter
Heb gezocht, maar ik kom er nog (steeds) niet uit. Welke kolommen moet ik nu 'joinen' dan? En ik heb eigenlijk een count() nodig van het aantal reacties (news_id where id = nieuws_id) pér nieuws-item.

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Je zal in nieuws_comments toch wel een veld hebben dat specifieert naar welk record in de tabel 'nieuws' dat record verwijst.
Op die velden moet je dus joinen.

Daarnaast zal je ook nog eens moeten kijken naar de GROUP BY clausule.
code:
1
2
3
select veld1, sum(*)
from tabel
group by veld1


Ik denk dat je hier wel wat aan hebt.

[ Voor 14% gewijzigd door whoami op 21-08-2003 16:44 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
heb nu het volgende:
code:
1
2
3
4
SELECT titel, count(news_id)
FROM lommers_nieuws, lommers_nieuws_comments
LEFT JOIN lommers_nieuws_comments
ON lommers_nieuws.id=lommers_nieuws_comments.news_id

Maar krijg als foutmelding: Not unique table/alias: 'lommers_nieuws_comments'

Dacht toch echt dat het zo goed moest zijn :(

Verwijderd

code:
1
2
3
SELECT titel, count(news_id)
FROM lommers_nieuws LEFT JOIN lommers_nieuws_comments
ON lommers_nieuws.id=lommers_nieuws_comments.news_id

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Verwijderd schreef op 21 augustus 2003 @ 17:09:
heb nu het volgende:
code:
1
2
3
4
SELECT titel, count(news_id)
FROM lommers_nieuws, lommers_nieuws_comments
LEFT JOIN lommers_nieuws_comments
ON lommers_nieuws.id=lommers_nieuws_comments.news_id

Maar krijg als foutmelding: Not unique table/alias: 'lommers_nieuws_comments'

Dacht toch echt dat het zo goed moest zijn :(
Hoe lang heb je naar de foutmelding gekeken? Kijk nog eens goed naar de query en de fout melding. Het is zo voor de handliggend dat je zelf wel voor de kop kunt slaan.... 8)7

Programmer - an organism that turns coffee into software.


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Check nog eens goed de syntax van het join statement.
Als je een tabel opneemt in je JOIN statement (LEFT JOIN tabelnaam ON ... ), dan moet die tabelnaam niet meer voorkomen in je FROM statement.
Verder moet je ook nog een group by doen van de kolommen in je select - list die geen aggregated function zijn.

https://fgheysels.github.io/


Verwijderd

Topicstarter
edit:

WHAAAAAAAAA sorry, sorry, sorry... ik was er met m'n kop nie bij. :) Nogmaals sorry...

[ Voor 87% gewijzigd door Verwijderd op 21-08-2003 18:36 ]


Verwijderd

Topicstarter
Ik wordt nu hartstikke gek volgens mij. Query zit er goed in. Zie onderstaande code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$aantal_laten_zien  =   5;
$next = $start + $aantal_laten_zien;
$last = $start - $aantal_laten_zien;
if(!$start)
{
    $start = 0;
    $next = $start + $aantal_laten_zien;
}
$sql=mysql_query("SELECT lommers_nieuws.id, lommers_nieuws.datum, lommers_nieuws.titel, 
count( lommers_nieuws_comments.news_id ) FROM lommers_nieuws LEFT JOIN lommers_nieuws_comments 
ON lommers_nieuws.id = lommers_nieuws_comments.news_id GROUP BY lommers_nieuws.id DESC");
// $sql=mysql_query("select id,datum,titel from lommers_nieuws 
order by id ASC limit $start,$aantal_laten_zien");
$numrows=mysql_numrows($sql);
$content=mysql_fetch_row($sql);
            
for ($I=1; $I<= $numrows;$I++)
{
$datum = substr_replace("$content[1]","",5);
echo("<font size='1'>&nbsp;$datum</font>, 
<a class='news' href='nieuws.php?newsid=$content[0]'>$content[2] ($content[3])</a><br>");
$content    =   mysql_fetch_row($sql);
}

Nu laat ie het allemaal wel netjes (en tráááááág) zien, maar in de verkeerde volgorde. Als ik er DESC bij zet, dan gaat het hier op m'n lokale servertje wel goed, maar NIET op de plek waar ik host. Waar kan dit aan liggen? (Zie m'n home-page-button)

[ Voor 9% gewijzigd door Verwijderd op 21-08-2003 19:03 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
De traagheid kan te maken hebben met het feit dat je geen of slechte indexen op je tabel gemaakt hebt.
Creeër indexen op de velden waarop je zoekt, joined en evt. sorteert. (Ga ook geen onnodige indexen leggen. Dat vertraagt het inserten en updaten maar).

Dat je data niet in de gewenste volgorde komt is nogal wiedes, je hebt er geen ORDER BY statement in staan. Die DESC staat bij je GROUP BY , en dat heeft niets met ORDER BY te maken. Ik vind het zowiezo al raar dat MySQL het slikt dat er een DESC staat bij GROUP BY.

misschien toch ff die tutorial die ik eerder gepost heb bekijken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Oke, en dan nu m'n laatste vraagje: waar kan ik info vinden over het correct plaatsen van indexen? En waarom gaat het hier lokaal wel snel? In totaal zitten er trouwens maar iets van 500 records in de nieuws-tabel en zo'n 1500 in de comments-tabel. Is het dan al vereist dat er indexen op komen?
code:
1
2
3
Note: Updating a table containing indexes takes more time than updating 
a table without, this is because the indexes also need an update. So, it is a good
 idea to create indexes only on columns that are often used for a search.


Hmm.oke, dus ik kan het beste de indexen leggen op lommers_nieuws.id en lommers_nieuws_comments.id volgens dit stukkie tekst? Want hier is de query immers op 'gebaseerd' toch?

[ Voor 46% gewijzigd door Verwijderd op 21-08-2003 19:14 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
Verwijderd schreef op 21 August 2003 @ 19:08:
Oke, en dan nu m'n laatste vraagje: waar kan ik info vinden over het correct plaatsen van indexen?
Ik geloof dat er in de P&W FAQ ook een sectie aan gewijd is.
(Die FAQ dus ook eens lezen).
En waarom gaat het hier lokaal wel snel?
Misschien heeft het ook te maken met de hoeveelheid data die over het netwerk moet komen.
In totaal zitten er trouwens maar iets van 500 records in de nieuws-tabel en zo'n 1500 in de comments-tabel. Is het dan al vereist dat er indexen op komen?
ja.

https://fgheysels.github.io/

Pagina: 1