Tabellen koppelen en waarde uitegeven
Ik zit met het volgende "probleem". Ik heb een database genaamd munten en ik heb een database genaamd users. Nu wil ik graag op mijn website laten verschijnen welke munten diegene heeft die is ingelogt.
Dus als volgt laat ik mijn munten zien:
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
29
30
31
32
33
34
35
36
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
29
30
31
32
33
34
35
36
<?PHP
$user_name = "*****";
$password = "******";
$database = "munten";
$server = "localhost";
$db_handle = mysql_connect($server, $user_name, $password) or die (mysql_error());
$db_found = mysql_select_db($database, $db_handle);
if ($db_found) {
$SQL = "SELECT id, munt, jaar FROM ned_munten ORDER BY nummer ASC";
// test $SQL = "SELECT id, munt, jaar FROM ned_munten INNER JOIN users_munten
// test ON(ned_munten_id = id AND user_id = 6)";
$result = mysql_query($SQL);
// error afhandeling
if($result !==false){
}
else
echo mysql_error();
// end error afhandeling
while ( $db_field = mysql_fetch_assoc($result) ) {
echo $db_field['munt'];
echo $db_field['jaar'] . "<BR>" ;
}
mysql_close($db_handle);
}
else {
echo "Database kon niet gevonden worden: " . mysql_error();
mysql_close($db_handle);
}
?>
$user_name = "*****";
$password = "******";
$database = "munten";
$server = "localhost";
$db_handle = mysql_connect($server, $user_name, $password) or die (mysql_error());
$db_found = mysql_select_db($database, $db_handle);
if ($db_found) {
$SQL = "SELECT id, munt, jaar FROM ned_munten ORDER BY nummer ASC";
// test $SQL = "SELECT id, munt, jaar FROM ned_munten INNER JOIN users_munten
// test ON(ned_munten_id = id AND user_id = 6)";
$result = mysql_query($SQL);
// error afhandeling
if($result !==false){
}
else
echo mysql_error();
// end error afhandeling
while ( $db_field = mysql_fetch_assoc($result) ) {
echo $db_field['munt'];
echo $db_field['jaar'] . "<BR>" ;
}
mysql_close($db_handle);
}
else {
echo "Database kon niet gevonden worden: " . mysql_error();
mysql_close($db_handle);
}
?>
Zoals bij de test query kan je zien dat ik ook al een koppel tabel heb. Bij die test query laat hij alleen de munten zijn die gekoppeld zijn aan mijn user_id.
Dus is ik ben ingelogd en zie nu al mijn munten verschijnen die in de DB staan (uiteraard ;)) Maar nu wil ik achter veld jaar een 1 hebben staan als ik hem heb en een 2 als ik hem niet heb (wat ik later weer verander in een mooi plaatje van een plus en een min).
Hoe kan ik dit voor elkaar krijgen??
Groeten wessel
ps sorry als ik fouten heb gemaakt in mijn scripting maar ik ben ook geen doorgewinterde php'er. Dus graag opbouwende kritiek.
Gewijzigd op 01/10/2013 15:26:50 door Wes achternaam
Wessel lakerveld op 01/10/2013 15:26:06:
Ik heb een database genaamd munten en ik heb een database genaamd users.
Bedoel je hier database, of tabel? Logisch zou zijn tabel, maar aangezien je een connectie maakt met de database 'munten' en het ook hebt over een koppeltabel, vrees ik dat je ook echt twee databases hebt.
Op zich kan je probleem dan nog best opgelost worden (zonder moeilijk te doen zelfs), maar het lijkt me niet heel erg nodig om echt twee databases aan te maken.
De oplossing dan, is een simpele join.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT id, munt, jaar, IF(user_id IS NULL, 0, 1) AS heb_ik
FROM ned_munten
LEFT JOIN users_munten ON(
ned_munten_id = id
AND user_id = 6
)
FROM ned_munten
LEFT JOIN users_munten ON(
ned_munten_id = id
AND user_id = 6
)
Jij gebruikte in je test een INNER JOIN, die zou ik vervangen door een LEFT JOIN. Het verschil is dat bij een INNER JOIN de records uit ned_munten niet worden geselecteerd als er geen record uit de users_munten aan kan worden gehangen. Bij een LEFT JOIN is dat wel het geval. Wil je alleen de munten zien die je hebt, dan kan je een INNER JOIN gebruiken, wil je alle munten zien met daarbij of je ze hebt, dan heb je een LEFT JOIN nodig.
In de kolom 'heb_ik' kan je nu die 0 (heb ik niet) of de 1 (heb ik wel) zien.
disclaimer: kijk wel even goed naar de kolommen en tabellen. Ik heb simpel overgenomen wat je al had, dus geen idee of het klopt.
in plaats van
IF(user_id IS NULL, 0, 1) AS heb_ik
doe ik daar
ISNULL(user_id,0) AS heb_ik
maar de truc is inderdaad een LEFT JOIN.
korte uitleg welliswaar engels.
Before we continue with examples, we will list the types the different SQL JOINs you can use:
INNER JOIN: Returns all rows when there is at least one match in BOTH tables
LEFT JOIN: Return all rows from the left table, and the matched rows from the right table
RIGHT JOIN: Return all rows from the right table, and the matched rows from the left table
FULL JOIN: Return all rows when there is a match in ONE of the tables
Ik heb idd twee databases. 1tje voor users en anders voor munten.
mijn koppel tabel staat in de database munten.
Is de kolom heb_ik een nieuwe kolom die ik moet aanmaken in de koppel tabel of in de ned_munten tabel??
Ik heb de nieuwe join query gebruikt. Hij laat nu alles zien maar ik zie geen 1 of 2 erachter. In eerste instantie dacht ik dat dat met een if statement moest. Zoiets als:
If ned_munten_id = id AND user_id = 6 then (schrijf 1) else (schrijf 2)
Dat dacht ik maar ja kan er helemaal naast zitten.
Gewijzigd op 01/10/2013 16:22:10 door wes achternaam
heb_ik is geen kolom die je moet aanmaken. maar je kunt m wel gebruiken voor je echo.
Maar waarom 1 database maken??
Je maakt het jezelf een stuk makkelijker met 1 database, dat is naar mijn mening de voornaamste reden.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT id, munt, jaar, IF(user_id IS NULL, 0, 1) AS heb_ik
FROM ned_munten
LEFT JOIN users.users_munten ON(
ned_munten_id = id
AND user_id = 6
)
FROM ned_munten
LEFT JOIN users.users_munten ON(
ned_munten_id = id
AND user_id = 6
)
Maar beter is er 1 database van maken, omdat het simpelweg bij elkaar hoort. Het verschil tussen de entiteiten leg je al door het in verschillende tabellen te stoppen. Verder moet je altijd meer werk verzetten zelf (door rechten toe te kennen aan meerdere databases bijvoorbeeld), moet mysql meer werk verzetten (door het openen van 2 databases in plaats van 1) en heb je bij sommige hosts uberhaupt de mogelijkheid niet om meerdere databases aan te maken.