[php] 2 tabellen vergelijken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Het probleem is als volgt:

Ik heb 2 tabellen (in mysql) die ik met elkaar wil vergelijken. In de ene tabel staan boeken en in de andere (tussen)tabel genres.
Elk boek behoort een genre te hebben, maar nu wil ik voor mijn website een functie maken die controleert of er ook boeken zijn die geen genre hebben.
De tabel met boeken moet dus worden vergeleken met de tabel met genres. Elk boek wat geen genre heeft moet vervolgens worden geprint.
Globaal zien de tabellen er als volgt uit:

tabel: 1 tabel: 2
[isbn] [isbn]
[titel] [genre]

Tabellen met elkaar vergelijken dus, en wat wel in tabel 1 voorkomt, maar niet in 2 is dus een boek zonder genre.
Aangezien mysql geen subselects toelaat wilde ik dit met PHP loops doen, maar ik kom er (na hele tijd prutsen) er niet uit.
Een voorbeeld stukje code wat ik heb is:

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
$q1 = "select distinct b.isbn from boeken b ";
$r1 = mysql_query($q1, $connection);
$aantal1 = mysql_num_rows($r1);

$q2 = "select distinct tbg.isbn from tbg ";
$r2 = mysql_query($q2, $connection);
$aantal2 = mysql_num_rows($r2);

print("<p><b>$aantal1</b> boeken in db</p>\n<p>\n");
print("<p><b>$aantal2</b> boeken met genre in db</p>\n<p>\n");
 
while ($row1 = mysql_fetch_row($r1))
{

while ($row2 = mysql_fetch_row($r2))
{

if ($row2[0] != $row1[0]):

print("dit boek heeft geen genre: $row1[0]<BR>"); 

endif;

}

}


Het resultaat is dan een enorme lijst met isbn-nummers. Het ligt hem vast aan de while loops, maar met andere loops krijg ik het ook niet voor elkaar.
Met ASP werkt dit overigens wel, met while en movenext.
Hopelijk kunnen jullie me verder helpen.

Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij kan je dit met SQL oplossen. Wanneer je de kolom genre joint met de andere tabel is het dus makkelijk op te vragen of een boek een genre heeft. Probeer eens zoiets:
code:
1
2
3
4
5
SELECT b.titel
FROM boeken b, tbg t
WHERE
  b.isbn = t.isbn AND
  b.genre = ''


Puzzelze

[ Voor 5% gewijzigd door Verwijderd op 31-12-2002 01:19 . Reden: foutje in de query! ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank je wel voor je reactie, maar dat klopt niet helemaal. Jij controleert in je sql query of b.genre leeg is, maar dit kan niet zo zijn. de tabel tbg bevat alleen maar isbn's en genres en de tabel boeken alle boeken. Dit is zo gedaan omdat een boek meerdere genres kan hebben. Maar het is dus niet zo dat er velden leeg zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
en overgens is er geen b.genre (alleen b.titel en b.isbn).

Het zou wel kunnen met een subselect query zoals:

SELECT boeken.isbn
FROM boeken
WHERE boeken.isbn NOT IN
(SELECT tbg.isbn
FROM tbg);

Alleen kan MySQL dit niet aan...vandaar dat ik het met php wilde proberen.

[ Voor 84% gewijzigd door Verwijderd op 31-12-2002 01:34 ]


Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
ff een ander vraagje: waarom heb je een genre gekoppeld aan het isbn nummer?
Dit lijkt me logischer:

table1:
id,
isbn,
titel,
genre_id

table2:
id,
genre

En nu is het heel simpel om op te vragen welke boeken geen genre hebben door default je genre_id op 0 te laten staan, alleen veranderen als die een genre heeft, dan kun je dus met:
PHP:
1
2
3
4
5
6
7
8
9
$query = "select
            id,
            title,
            isbn
          from
            books
          where
            genre_id = '0'
          ;";

...het lijstje opvragen wat jij wilt!

Ook Knor is aangestoken met het ligfietsvirus!


Acties:
  • 0 Henk 'm!

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:09
Rotjeknor: jouw oplossing is mooi, maar alleen als een boek maar 1 genre zou hebben, en zoals f4l aangaf kunnen dat er ook meer zijn.

F4l: ik weet helaas ook niet zo 123 een oplossing, maar het lijkt me raar als het niet op een makkelijke manier op te lossen is, zo'n exotisch probleem is het toch niet.

Acties:
  • 0 Henk 'm!

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 13-09 21:14

Skinny

DIRECT!

tabel 'titels' is jouw tabel 1
tabel 'genre' is jouw tabel 2

Als ik nu drie isbn-nummers met titel invoer in 'titels' en van titel 1 en 3 een genre invul. 'genre' heeft nu maar 2 records, dan krijg ik deze netjes terug met :

code:
1
2
3
SELECT t.isbn, t.titel, g.genre
FROM titels t LEFT JOIN genre g ON t.isbn = g.isbn
WHERE g.genre IS NULL


Door die LEFT JOIN worden namelijk alle velden genre NULL waarvoor geen gekoppeld record in 'titels' gevonden kan worden.

HTH

[ Voor 21% gewijzigd door Skinny op 31-12-2002 08:43 ]

SIZE does matter.
"You're go at throttle up!"


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Rotjeknor schreef op 31 december 2002 @ 02:58:
ff een ander vraagje: waarom heb je een genre gekoppeld aan het isbn nummer?
Dit lijkt me logischer:
[..]

Eigenschap van een ISBN nummer is dat het uniek is. Je kunt namelijk naar een boekenwinkel gaan, een ISBN nummer geven en je krijgt precies het boek wat je wou hebben.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18-09 16:51
Die is wel langer als een id-veld, tenzij je natuurlijk enorm veel boeken pakt, dit is waarschijnlijk dus sneller. Ook als je een tikfout in je isbn nummer hebt is het handiger omdat je anders 2 tabellen moet updaten.

Volgens mij is dit gewoon het ergste probleem wat je met mysql hebt, je kunt niet zomaar even snel in hetzelfde query een id uit een andere tabel halen. Je moet hiervoor meerdere query's gebruiken, en dat kost performance. Misschien moet je als je veel van dit soort query's wilt gaan maken een andere db gaan gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Skinny schreef op 31 december 2002 @ 08:43:
tabel 'titels' is jouw tabel 1
tabel 'genre' is jouw tabel 2

Als ik nu drie isbn-nummers met titel invoer in 'titels' en van titel 1 en 3 een genre invul. 'genre' heeft nu maar 2 records, dan krijg ik deze netjes terug met :

code:
1
2
3
SELECT t.isbn, t.titel, g.genre
FROM titels t LEFT JOIN genre g ON t.isbn = g.isbn
WHERE g.genre IS NULL


Door die LEFT JOIN worden namelijk alle velden genre NULL waarvoor geen gekoppeld record in 'titels' gevonden kan worden.

HTH
Inderdaad, deze query werkt wel! Ik dacht dat het perse met een subselect query moest, maar het kan dus met een left join. Wat een PHP vraag was, was dus eigenlijk een SQL vraag :)
Bedankt!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
djluc schreef op 31 December 2002 @ 11:09:
Die is wel langer als een id-veld, tenzij je natuurlijk enorm veel boeken pakt, dit is waarschijnlijk dus sneller. Ook als je een tikfout in je isbn nummer hebt is het handiger omdat je anders 2 tabellen moet updaten.

Volgens mij is dit gewoon het ergste probleem wat je met mysql hebt, je kunt niet zomaar even snel in hetzelfde query een id uit een andere tabel halen. Je moet hiervoor meerdere query's gebruiken, en dat kost performance. Misschien moet je als je veel van dit soort query's wilt gaan maken een andere db gaan gebruiken.
Een tikfout in een ISBN nummer is inderdaad het grootste probleem bij mijn opzet en dan kan het ook nog voorkomen dat je boeken krijgt zonder ISBN nummer (waarna ik mijn eigen fake ISBN verzin). Maar het heeft ook voordelen om ISBN's te gebruiken, je kunt nu pagina's benaderen met ISBN nummer (ipv met ID) wat wat 'natuurlijker' werkt.

Zie http://www.jori-fokke.net/boek.php?isbn=90-253-0639-X voor wat ik bedoel. Dit is dus tevens die site waarbij ik dat probleem had.

Hartelijk dank voor alle hulp.

[ Voor 3% gewijzigd door Verwijderd op 31-12-2002 11:24 ]


Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
los_joost schreef op 31 december 2002 @ 03:21:
Rotjeknor: jouw oplossing is mooi, maar alleen als een boek maar 1 genre zou hebben, en zoals f4l aangaf kunnen dat er ook meer zijn.
[...]
Ok. Nieuwe versie van mijn oplossing:
table books:
id,
isbn,
titel

table genres:
id,
genre

table books_genres:
book_id
genre_id
dusty schreef op 31 december 2002 @ 09:35:
Eigenschap van een ISBN nummer is dat het uniek is. Je kunt namelijk naar een boekenwinkel gaan, een ISBN nummer geven en je krijgt precies het boek wat je wou hebben.
--->
djluc schreef op 31 December 2002 @ 11:09:
Die is wel langer als een id-veld, tenzij je natuurlijk enorm veel boeken pakt, dit is waarschijnlijk dus sneller. Ook als je een tikfout in je isbn nummer hebt is het handiger omdat je anders 2 tabellen moet updaten.
Precies djluc!

Ook Knor is aangestoken met het ligfietsvirus!


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18-09 16:51
Dat aanroepen is toch enorm eenvoudig te verwerken:
PHP:
1
2
$isbn=$_POST['isbn'];
$sql="SELECT isbn, titel FROM deboekentabel WHERE isbn='$isbn'";

[ Voor 16% gewijzigd door djluc op 31-12-2002 17:01 . Reden: [/php] vergeten ]


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 18-09 11:31
Als je problemen hebt met tikfouten in je ISBN nummers: er bestaat een vrij simpel algoritme was controleert of je ISBN nummer een geldig nummer is. Kun je laten uitvoeren voordat je je data in je db propt zodat er in ieder geval nooit foutieve nummers inzitten. Kijk als je per ongeluk een typfout maakt en nog steeds een geldig nummer intikt kan je er weinig aan doen maar dit helpt toch alweer een beetje nietwaar :).
Zal eens kijken of ik het artikeltje ergens kan vinden

edit:
Meer info is hier te vinden: http://mathworld.wolfram.com/ISBN.html en als ik even wat info gebruik uit een college:
"Stel dat de cijfers van links naar rechts gegeven zijn door a1a2...a10. Zo'n rijtje van 10 cijfers is een geldig ISBN dan en slechts dan als als de gewogen cijfersom

(som k: 1 <= k <= 10: k*ak )
een 11-voud is. De 'X' telt hierbij als 10." Voor de mensen die geen zin hebben te zoeken :) Ik ben trouwens benieuwd voor wie dit allemaal bekend overkomt ;)

[ Voor 35% gewijzigd door jsiegmund op 31-12-2002 17:05 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18-09 16:51
Dat zou idd wel een handige uitbreiding zijn om de eerste fouten te vinden, maar zoals je zelf al zegt, je kunt ook de foute correcte isbn invullen.
Pagina: 1