2 join's
Ik gebruik nu deze query voor mijn RSS feed:
Code (php)
1
2
3
4
2
3
4
<?
$query1 = "SELECT DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date, content.id, content.alinea1, content.title FROM sections_content LEFT JOIN content ON sections_content.cid = content.id
WHERE content.status='1' AND content.archive='0' AND sections_content.sid='1' ORDER BY content.id DESC LIMIT 10";
?>
$query1 = "SELECT DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date, content.id, content.alinea1, content.title FROM sections_content LEFT JOIN content ON sections_content.cid = content.id
WHERE content.status='1' AND content.archive='0' AND sections_content.sid='1' ORDER BY content.id DESC LIMIT 10";
?>
de data komt uit de tabel 'content' en een join on 'sections_content'.
zo filter ik dus alle content met een sections_content.sid='1'.
nu wi ik graag nog een extra filter. uit de tabel content_local moet er dus bij.
Hoe kan ik dit nu het beste doen?
Gr TIm
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT
DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date,
content.id,
content.alinea1,
content.title
FROM
sections_content
LEFT JOIN
content
ON sections_content.cid = content.id
WHERE
content.status='1'
AND
content.archive='0'
AND
sections_content.sid='1'
ORDER BY
content.id DESC
LIMIT
10
DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date,
content.id,
content.alinea1,
content.title
FROM
sections_content
LEFT JOIN
content
ON sections_content.cid = content.id
WHERE
content.status='1'
AND
content.archive='0'
AND
sections_content.sid='1'
ORDER BY
content.id DESC
LIMIT
10
Verder kun je achter je bestaande JOIN gewoon nog een JOIN toevoegen. Zie voor meer informatie deze tutorial over joins in SQL.
ps. Dus iets in de trend van:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
LEFT JOIN
content
ON sections_content.cid = content.id
LEFT JOIN
content_local
ON ...
content
ON sections_content.cid = content.id
LEFT JOIN
content_local
ON ...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
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
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?
SELECT
DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date,
content.id,
content.alinea1,
content.title,
content_local.someren
FROM
sections_content
LEFT JOIN
content
ON sections_content.cid = content.id
LEFT JOIN
content
ON content_local.cid = content.id
WHERE
content.status='1'
AND
content.archive='0'
AND
sections_content.sid='1'
AND
content_local.someren='1'
ORDER BY
content.id DESC
LIMIT
10
?>
SELECT
DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date,
content.id,
content.alinea1,
content.title,
content_local.someren
FROM
sections_content
LEFT JOIN
content
ON sections_content.cid = content.id
LEFT JOIN
content
ON content_local.cid = content.id
WHERE
content.status='1'
AND
content.archive='0'
AND
sections_content.sid='1'
AND
content_local.someren='1'
ORDER BY
content.id DESC
LIMIT
10
?>
Gewijzigd op 01/01/1970 01:00:00 door Tim
En wat werkt er niet? Welke foutmelding krijg je?
<b>Warning</b>: mysql_num_rows(): supplied argument is not a valid MySQL result resource in rss-view1.php
wat kan er nu ineens fout gaan...
COntroleer eens of je query gelukt is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$qSql = "SELECT ...":
$rSql = mysql_query($qSql);
if(!$rSql)
{
echo mysql_error();
}
else
{
// de rest
}
?>
$qSql = "SELECT ...":
$rSql = mysql_query($qSql);
if(!$rSql)
{
echo mysql_error();
}
else
{
// de rest
}
?>
Dan krijg ik dit "Not unique table/alias: 'content' "
content
LEFT JOIN
content
Dat staat er dus 2x en is dus niet uniek. De foutmelding is dus weer eens geheel correct.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
...
FROM
content
LEFT JOIN sections_content ON sections_content.cid = content.id
LEFT JOIN content_local ON content_local.cid = content.id
...
FROM
content
LEFT JOIN sections_content ON sections_content.cid = content.id
LEFT JOIN content_local ON content_local.cid = content.id
...
Controleer even of de LEFT JOIN wel goed is, ik weet niet welke data jij verwacht.
Ps. Een beetje inspringen met je SQL kan geen kwaad, dat houdt de boel leesbaar. En dus eenvoudig te begrijpen en te debuggen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
SELECT
DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date, content.id, content.alinea1, content.title, content_local.someren
FROM
content
LEFT JOIN sections_content ON sections_content.cid = content.id
LEFT JOIN content_local ON content_local.cid = content.id
WHERE
content.status='1'
AND
content.archive='0'
AND
sections_content.sid='1'
AND
content_local.someren='1'
ORDER BY
content.id DESC
LIMIT
10
?>
SELECT
DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date, content.id, content.alinea1, content.title, content_local.someren
FROM
content
LEFT JOIN sections_content ON sections_content.cid = content.id
LEFT JOIN content_local ON content_local.cid = content.id
WHERE
content.status='1'
AND
content.archive='0'
AND
sections_content.sid='1'
AND
content_local.someren='1'
ORDER BY
content.id DESC
LIMIT
10
?>
En het werkt perfect! weer iets geleerd vandaag!
Een alias met dezelfde naam als het origineel, dat is smeken om problemen. De alias heeft namelijk een andere inhoud dan het origineel en "MOET" je dus een andere naam geven. Doe je dat niet, ga je vroeg of laat problemen krijgen, ga maar eens sorteren op datum.
Sorteren op id slaat nergens op, een id is er om een uniek record aan te wijzen. Het zegt niks, null noppes nada over enige volgorde, ouderdom of wat dan ook. Sorteren op iets unieks zegt niks, je hebt dan echt geen flauw idee waar je op sorteert. ASC of DESC op een totaal onbekende sortering voegt dan ook niks toe en zal je evenmin verder helpen. Gooi de sortering weg of ga sorteren op iets relevants.
Dit heb ik je vaker zien zeggen... maar als je id veld een auto_increment veld is, dan kan je er toch prima op sorteren?
Het doet in ieder geval wat het moet doen. Indien het nog steeds niet goed is, hoor ik heel graag van je waarom :)
Komt bij dat een database de data toch al in een bepaalde volgorde op schijf wegschrijft, zolang je daar niets aan verandert, is het niet eens nodig om te sorteren. Je krijgt dan dezelfde volgorde terug als waarin de boel is aangemaakt. In PostgreSQL zal de volgorde van data pas veranderen wanneer je met VACUUM de boel gaat optimaliseren, dan kan op schijf ineens nieuwere data tussen de oude data komen te staan. Deze "gaten" zijn ontstaan door het verwijderen van data, hier kan de database dan nieuwe records gaan neerzetten. Deze "volgorde" zegt dan ook niks, ken hier dan ook geen enkele betekenis aan toe. Met andere databases is dat niet heel erg anders. Wanneer jij wilt sorteren op ouderdom, zul je de aanmaakdatum moeten opslaan en daarop moeten sorteren.