SQL join
Ik zie wel dat je uit 2 tabellen iets tegelijk kan selecteren.
Maar is het mogelijk om uit 3 tabellen tegelijk te selecteren?
Edit:
Ik geloof dat ik een perfect voorbeeld heb gevonden.http://www.phphulp.nl/php/tutorials/3/205/378/
Gewijzigd op 01/01/1970 01:00:00 door Nigel
Ja waarom zal dat niet kunnen
http://www.phphulp.nl/php/tutorials/3/205/378/
wel dat valt onder `pruts` tutorials
Denk dat je hier beter je weg zult vinden:
http://www.w3schools.com/SQL/sql_join.asp
nu selecteert hij alleen maar uit de tabel projecten.
en echo alleen de waardes uit tabel projecten 4x hetzelfde.
Ook heb ik het idee dat ik de verkeer functie gebruik(mysql_fetch_array)(assoc) geeft zelfde resultaat.
Als ik uit maar 1 tabel selecteer en meerdere dingen wil echo'en gebruik ik
mysql_fetch_assoc
--
Nog even duidelijk maken wat mijn bedoeling is.
op het moment selecteren uit 2 tabellen. scripts en projecten
allebij hebben ze een veldnaam "date"
Het is de bedoeling dat ik al die waardes op een rijtje krijg
Welke funtie moet ik gebruiken.
Of wat doe ik fout?
--
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?
$sql = "SELECT t1.date, t2.date FROM ";
$sql .= "scripts AS t1, projecten AS t2 ";
$res = mysql_query($sql);
while ($row = mysql_fetch_array($res)){
echo"" . $row['date'] . "<br />";
echo"" . $row['id'] . "<br />";
}
?>
$sql = "SELECT t1.date, t2.date FROM ";
$sql .= "scripts AS t1, projecten AS t2 ";
$res = mysql_query($sql);
while ($row = mysql_fetch_array($res)){
echo"" . $row['date'] . "<br />";
echo"" . $row['id'] . "<br />";
}
?>
Het je moet geen veldnamen gebruiken welke gereserveerd zijn dan wel een type definitie zijn dan wel lijken op een sql-functie
En flikker nu toch eens mysql_fetch_array in de prullenbak en gebruik altijd
mysql_fetch_assoc!!
zie het verschil:
http://www.php.net/mysql_fetch_array
http://www.php.net/mysql_fetch_assoc
Als je gewoon een lijstje met de meest recente projecten en scripts door elkaar wilt hebben, is UNION wat je zoekt denk ik ;)
Om meer dan 2 tabellen te selecteren gebruik ik zelf altijd LEFTJOIN .
Tim Kampherbeek schreef op 14.06.2009 02:22:
Om meer dan 2 tabellen te selecteren gebruik ik zelf altijd LEFTJOIN .
Volgens mij moet Nigel gewoon doen wat Jelmer zegt.
En ik hoop dat je niet echt altijd een LEFT JOIN gebruikt, aangezien dat voor hele rare, foute of gevaarlijke resultaten kan zorgen.
Jelmer schreef op 14.06.2009 01:04:
Houd er wel rekening mee dat in een UNION de (datatypen van de) velden in beide SELECT clausules overeen moeten komen. Zoiets gaat niet werken als je uit twee echt verschillende tabellen wilt selecteren.Als je gewoon een lijstje met de meest recente projecten en scripts door elkaar wilt hebben, is UNION wat je zoekt denk ik ;)
Tim Kampherbeek schreef op 14.06.2009 02:22:
Ik betwijfel dat jij weet wat een LEFT JOIN nu precies doet. Misschien dat het handig is om dat eerst eens uit te zoeken voordat je dit soort onnozele antwoorden geeft?Om meer dan 2 tabellen te selecteren gebruik ik zelf altijd LEFTJOIN .
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Welke is dat? MySQL of een andere?
En Tim verdorie stop eens met zo uit je nek te lullen!
Hipska schreef op 14.06.2009 12:00:
OMG! Wat is er met uw database gebeurd klaasjan? :-O
Welke is dat? MySQL of een andere?
En Tim verdorie stop eens met zo uit je nek te lullen!
Welke is dat? MySQL of een andere?
En Tim verdorie stop eens met zo uit je nek te lullen!
Wat bedoel je Hipska
Zoals je al ziet aan het resultaat dat je het gegeven voorbeeld krijgt, slaat de betekenis nergens op. UNION is niet bedoeld om verschillende soorten gegevens in een resultaatset te proppen, het moet wel een zinnige betekenis hebben.
Tenslotte is er nog een laatste nadeel aan het gebruik van UNION. Als je het hebt over projecten en scripts, dan is het best mogelijk dat er gegevens zijn die bijvoorbeeld wel voor een project bestaan maar niet voor een script. In een query met UNION is het al niet mogelijk om deze gegevens op te halen.
ps. Even een voorbeeldje van een UNION die onzin oplevert:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT postcode AS onzin FROM postcodes UNION SELECT ip FROM ipadres;
+-----------------+
| onzin |
+-----------------+
| 3500 |
| 3511 |
| 3495 |
| 3502 |
| 3493 |
| 3506 |
| 127.0.0.1 |
| 123.123.123.123 |
| 123.456.123.456 |
| 123.456.456.123 |
| 1.1.1.1 |
+-----------------+
11 rows in set (0.00 sec)
+-----------------+
| onzin |
+-----------------+
| 3500 |
| 3511 |
| 3495 |
| 3502 |
| 3493 |
| 3506 |
| 127.0.0.1 |
| 123.123.123.123 |
| 123.456.123.456 |
| 123.456.456.123 |
| 1.1.1.1 |
+-----------------+
11 rows in set (0.00 sec)
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Ik ben voor mijn site een nieuws module aan het maken.
3 tabellen. projecten,scripts, en nieuws(die liet ik nog even achterwegen)
Nu is het de bedoeling dat ik de nieuwste 5 ga weergeven uit die 3 tabellen.
Nu hou ik me eerst beperkt tot 2 tabellen, aangezien het voor mij nieuw is,Lijkt dit al moeilijk genoeg.
Nu ga ik eerst even de rest van de posts doornemen.
@noppes. mysql_fetch_array gebruik ik verder ook niet.
Dat stond toevallig in die ene tut die jij de deur wees ;)
@blanche Ik hoef eigenlijk ook maar 2 velden uit de database te hebben.
Date (de datum van de plaatsing)
en id (nodig om door te verwijzen)
nu zit ik te denken aan een derde. want ik wil graag dat scripts word doorverwezen naar een andere pagina da een project.
Maar dat even achterwegen gelaten
Gewijzigd op 01/01/1970 01:00:00 door Nigel
edit:
Een manier om het verschil te zien tussen projecten en scripts is iets a la
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(SELECT
'project' as id_type,
projecten.id as id,
projecten.naam as naam,
projecten.aangemaakt_op as gemaakt_op
FROM
projecten)
UNION
(SELECT
'nieuws' as id_type,
nieuws.id as id,
nieuws.titel as naam,
nieuws.geschreven_op as gemaakt_op
FROM
nieuws)
ORDER BY
gemaakt_op DESC
'project' as id_type,
projecten.id as id,
projecten.naam as naam,
projecten.aangemaakt_op as gemaakt_op
FROM
projecten)
UNION
(SELECT
'nieuws' as id_type,
nieuws.id as id,
nieuws.titel as naam,
nieuws.geschreven_op as gemaakt_op
FROM
nieuws)
ORDER BY
gemaakt_op DESC
edit (vergeten :P) je kan nu in je PHP script afhankelijk wat er in $row['id_type'] zit naar de goeie pagina op basis van $row['id'] verwijzen.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
CREATE TABLE `nieuws` (
`id` int(11) NOT NULL auto_increment,
`content` longtext collate utf8_unicode_ci NOT NULL,
`naam` varchar(99) collate utf8_unicode_ci NOT NULL,
`date` varchar(32) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
`id` int(11) NOT NULL auto_increment,
`content` longtext collate utf8_unicode_ci NOT NULL,
`naam` varchar(99) collate utf8_unicode_ci NOT NULL,
`date` varchar(32) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
CREATE TABLE `scripts` (
`id` int(11) NOT NULL auto_increment,
`prijs` decimal(10,2) NOT NULL,
`naam` varchar(99) collate utf8_unicode_ci NOT NULL,
`omschrijving` longtext collate utf8_unicode_ci NOT NULL,
`betaalurl` varchar(99) collate utf8_unicode_ci NOT NULL,
`versie` varchar(32) collate utf8_unicode_ci NOT NULL,
`date` varchar(32) collate utf8_unicode_ci NOT NULL default '00/00/0000 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
`id` int(11) NOT NULL auto_increment,
`prijs` decimal(10,2) NOT NULL,
`naam` varchar(99) collate utf8_unicode_ci NOT NULL,
`omschrijving` longtext collate utf8_unicode_ci NOT NULL,
`betaalurl` varchar(99) collate utf8_unicode_ci NOT NULL,
`versie` varchar(32) collate utf8_unicode_ci NOT NULL,
`date` varchar(32) collate utf8_unicode_ci NOT NULL default '00/00/0000 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
CREATE TABLE `projecten` (
`id` int(11) NOT NULL auto_increment,
`img` varchar(99) collate utf8_unicode_ci NOT NULL,
`naam` varchar(99) collate utf8_unicode_ci NOT NULL,
`omschrijving` varchar(999) collate utf8_unicode_ci NOT NULL,
`url` varchar(99) collate utf8_unicode_ci NOT NULL,
`date` varchar(32) collate utf8_unicode_ci NOT NULL default '00/00/0000 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
`id` int(11) NOT NULL auto_increment,
`img` varchar(99) collate utf8_unicode_ci NOT NULL,
`naam` varchar(99) collate utf8_unicode_ci NOT NULL,
`omschrijving` varchar(999) collate utf8_unicode_ci NOT NULL,
`url` varchar(99) collate utf8_unicode_ci NOT NULL,
`date` varchar(32) collate utf8_unicode_ci NOT NULL default '00/00/0000 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Hoe moet ik dit dan in een lijst weergeven.
want ik krijg nu een error?
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
$sql="(SELECT
'project' as id_type,
projecten.id as id,
projecten.naam as naam,
projecten.aangemaakt_op as date
FROM
projecten)
UNION
(SELECT
'scripts' as id_type,
scripts.id as id,
scripts.titel as naam,
scripts.geschreven_op as date
FROM
nieuws)
ORDER BY
date DESC ";
$sql1 = mysql_query($sql) ;
while ($row = mysql_fetch_assoc($sql1)){
echo $row['date'];
}
?>
$sql="(SELECT
'project' as id_type,
projecten.id as id,
projecten.naam as naam,
projecten.aangemaakt_op as date
FROM
projecten)
UNION
(SELECT
'scripts' as id_type,
scripts.id as id,
scripts.titel as naam,
scripts.geschreven_op as date
FROM
nieuws)
ORDER BY
date DESC ";
$sql1 = mysql_query($sql) ;
while ($row = mysql_fetch_assoc($sql1)){
echo $row['date'];
}
?>
als ik niks echo heb ik dezelfde error ook.
en ik denk dat ik nu het verkeerde echo?
Gewijzigd op 01/01/1970 01:00:00 door Nigel
ps. Dus iets in de trend van:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$sql = '...'
$result = mysql_query($sql);
if(!$result) {
trigger_error(mysql_error().' In query: '.$sql);
}
else {
// Verder met je script
}
?>
$sql = '...'
$result = mysql_query($sql);
if(!$result) {
trigger_error(mysql_error().' In query: '.$sql);
}
else {
// Verder met je script
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
heb or die(mysql_error()) erachter gezet.
krijg nu dit.
Unknown column 'projecten.aangemaakt_op' in 'field list'
Dus die in date verandert.
Maar goed dan krijg ik de error
Unknown column 'scripts.id' in 'field list'
En die snap ik niet helemaal?
Gewijzigd op 01/01/1970 01:00:00 door Nigel
Blanche schreef op 14.06.2009 12:16:
zelfs dat is niet nodig. In mijn voorbeeld is gemaakt een DATE en link een VARCHAR....Ik was in mijn post misschien niet helemaal duidelijk. Het zijn de datatypen die voor een UNION in ieder geval overeen moeten komen wil de query slagen. ...
Nigel schreef op 14.06.2009 13:14:
Je selecteert uit de tabel 'nieuws' dus dan zal de kolom scripts.id inderdaad niet bestaan.Unknown column 'scripts.id' in 'field list'
En die snap ik niet helemaal?
En die snap ik niet helemaal?
Klaasjan Boven schreef op 14.06.2009 13:17:
Dat heet MySQL. Zo'n query zal zeker een foutmelding geven in elke zichzelf respecterende database. Het is immers onmogelijk om twee verschillende datatypen met elkaar te mengen, want wat is dan immers het datatype van de resulterende set gegevens?zelfs dat is niet nodig. In mijn voorbeeld is gemaakt een DATE en link een VARCHAR