2 join's

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tim

Tim

26/01/2009 15:06:00
Quote Anchor link
Hej Allemaal,

Ik gebruik nu deze query voor mijn RSS feed:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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"
;
?>


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
 
PHP hulp

PHP hulp

24/11/2024 11:21:43
 
Joren de Wit

Joren de Wit

26/01/2009 15:11:00
Quote Anchor link
Tip: schrijf je queries netjes uit, dat maakt e.e.a. al een stuk overzichtelijker:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
LEFT JOIN
  content
    ON sections_content.cid = content.id
LEFT JOIN
  content_local
    ON ...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Tim

Tim

26/01/2009 15:36:00
Quote Anchor link
Ik had nu dus dit, maar dat werkt niet ;p
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
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
 
Joren de Wit

Joren de Wit

26/01/2009 16:26:00
Quote Anchor link
En wat werkt er niet? Welke foutmelding krijg je?
 
Tim

Tim

26/01/2009 17:42:00
Quote Anchor link
Dit:
<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...
 
Citroen Anoniem Graag

Citroen Anoniem Graag

26/01/2009 17:49:00
Quote Anchor link
Je msit je foutafhandeling:

COntroleer eens of je query gelukt is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
}
?>
 
Tim

Tim

26/01/2009 17:53:00
Quote Anchor link
Dan krijg ik dit "Not unique table/alias: 'content' "
 
Frank -

Frank -

26/01/2009 18:21:00
Quote Anchor link
LEFT JOIN
content
LEFT JOIN
content

Dat staat er dus 2x en is dus niet uniek. De foutmelding is dus weer eens geheel correct.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
...

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.
 
Tim

Tim

29/01/2009 16:18:00
Quote Anchor link
Dit is het nu geworden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>

En het werkt perfect! weer iets geleerd vandaag!
 
Frank -

Frank -

29/01/2009 16:24:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
DATE_FORMAT(content.pub_date, '%a, %d %b %Y %T') AS pub_date

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.
 
Erik Rijk

Erik Rijk

29/01/2009 16:40:00
Quote Anchor link
Frank,

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 :)
 
Frank -

Frank -

29/01/2009 16:47:00
Quote Anchor link
Omdat je in de problemen komt bij een crash van je systeem en het terugzetten van een backup. De boel draait in het honderd, je brengt snel het systeem weer in de lucht (auto_increment begint weer bij 0 en loopt weer op) en vervolgens moet je de oude data nog importeren in je nieuwe database. Er moeten dan nieuwe id's worden aangemaakt voor de oude data, oude data krijgt dan hogere nummers dan nieuwe data. Ziedaar je probleem.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.