[mysql] twee tabellen, verschillende data en displayen

Pagina: 1
Acties:

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ik heb twee totaal verschillende tabbellen:
archi_foto en archi_books

deze twee tabellen bevatten een groot aantal gegevens en zijn ook afzonderlijk aan te roepen (dus samenvoegen heeft geen zin).

wat ik nu wil doen is op een portal pagina 1 query maken die beide tabellen gebruikt en deze dan chronologisch op het veld dat_up selecteerd/ordend. zodat beide soorten gegevens op de portal komen te staan. Als ik een join (inner/left of right) gebruik dan worden ze slechts gelink als zijnde het twee tabellen die een relatie met elkaar hebben... maar dat hebben ze dus niet.

om het nog een beetje moeilijker te maken moet voor ieder element in de array gefetched door mysql_fetch_array() bekeken worden uit welke tabel ie komt en afhankelijk daarvan moet of functie 1 of functie 2 opgeroepen worden.

ik zie door het bomen het bos niet meer.. jullie wel :?

[ Voor 16% gewijzigd door hobbeldebobbel op 02-12-2005 14:42 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Als de tabellen qua structuur hetzelfde zijn kun je het UNION statement gebruiken.

SQL:
1
2
3
4
SELECT * FROM archi_foto
UNION
SELECT * FROM archi_books
ORDER BY dat_up ASC

Oops! Google Chrome could not find www.rijks%20museum.nl


  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
ze zijn juist niet het zelfde ;) dat is het probleem...
archibooks heeft andere velden als archi_foto
anders was het makkelijk geweest :)

[ Voor 19% gewijzigd door hobbeldebobbel op 02-12-2005 14:43 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet


Verwijderd

Werkt een union niet?
code:
1
2
3
4
5
6
Select 0 as bron, dat_up from archi_foto

Union

Select 1 as bron, dat_up from archi_books
Order by dat_up


Hierbij moeten de beide velden wel van exact hetzelfde type zijn

edit: sneller typen...

Twee echt verschillende recordssets als 1 behandelen gaat natuurlijk nooit lukken, maar als gedeelten enigszins overeenkomen kun je nog een eind komen door te casten naar een voor beide tabellen bruikbaar formaat. Maar ik zou niet proberen om alles in te lezen. Gewoon datgene wat je echt nodig hebt om te kunnen selecteren (dus een PK en omschrijving gok ik) De rest lees je dan wel in na de selectie

[ Voor 57% gewijzigd door Verwijderd op 02-12-2005 14:52 ]


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Hebben ze evenveel kolommen?

IIG hoe jij het wil kun je met een UNION doen.

SELECT veld1, veld2, veld3, "tabelnaam" AS tabelnaam FROM tabel
UNION
SELECT veld1, veld2, NULL, "tabelnaam2" AS tabelnaam FROM tabel2
ORDER BY dat_up

Je zult even met de NULL-waarde moeten zorgen dat beide queries evenveel kolommen teruggeven en aan het "veld" tabelnaam kun je zien uit welke tabel het dan komt :).

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 22-04 17:52

Dido

heforshe

Dan moet je je afvragen welke velden wel en niet overeenkomen en iets doen als
code:
1
2
3
4
5
select "tabel1" as tabelnaam, veld1 as display1, veld2 as display2, null as display3, veld3 as display 4, null as display5 
from tabel1
union
select "tabel2" as tabelnaam, veldx as display1, null as display2, veldy as display3, null as display 4, veldz as display5 
from tabel2

Wat betekent mijn avatar?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Maar ik neem aan dat de velden die je wilt laten zien wel gelijk zijn, hoe kun je het anders in 1 overzicht tonen?

Bijvoorbeeld

Boeken
----------
BoekId
Titel
Auteur

Films
--------
FilmId
JaarVanPubllicatie
Titel
Regisseur

Bovenstaande tabellen kun je nog wel UNION-en,

SQL:
1
2
3
4
SELECT BoekID as Id, Titel, Auteur as Maker FROM Boeken
UNION
SELECT FilmId, Titel, Regisseur FROM Films
ORDER BY Maker


Je snapt wel wat ik bedoel denk ik?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
P_de_B schreef op vrijdag 02 december 2005 @ 14:46:
Maar ik neem aan dat de velden die je wilt laten zien wel gelijk zijn, hoe kun je het anders in 1 overzicht tonen?
dit is de opzet.....
het moet een overzicht worden van de laatst toegevoegde objecten. Dit kan in de tabel archi_foto en archi_books zijn. een archi_foto-object zal bijvoorbeeld het plaatje belangrijkzijn, dus groot afgebeeld moeten worden. Terwijl bij een boek de titel en schrijver belangrijk zijn (vandaar dus ook in de Topic start in de laatste alinea: dat ik wil wetenuit welke tabel het komt zodat ik functie 1 of 2 kanlaten lopen :)

ik ga eens met die union kloten..... eerst even eten en een frisse neus halen :)

hier zou een slimme opmerking kunnen staan
maar die staat er niet


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Om te weten uit welke tabel het komt kun je nog het volgende doen:

SQL:
1
2
3
4
SELECT 'Boeken' as WelkeTabel, BoekID as Id, Titel, Auteur as Maker FROM Boeken
UNION
SELECT 'Films', FilmId, Titel, Regisseur FROM Films
ORDER BY Maker

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Dido schreef op vrijdag 02 december 2005 @ 14:45:
Dan moet je je afvragen welke velden wel en niet overeenkomen en iets doen als
code:
1
2
3
4
5
select "tabel1" as tabelnaam, veld1 as display1, veld2 as display2, null as display3, veld3 as display 4, null as display5 
from tabel1
union
select "tabel2" as tabelnaam, veldx as display1, null as display2, veldy as display3, null as display 4, veldz as display5 
from tabel2
Zelfs dat is niet nodig in mysql (ik weet niet hoe het is met andere databases), heb het net even getest, maar mysql gaat gewoon uit van de rij-namen die in de eerste query zijn aangegeven :).

Type veld (INT / VARCHAR) maakt ook niet uit.

Verwijderd

P_de_B schreef op vrijdag 02 december 2005 @ 14:51:
Om te weten uit welke tabel het komt kun je nog het volgende doen:

SQL:
1
2
3
4
SELECT 'Boeken' as WelkeTabel, BoekID as Id, Titel, Auteur as Maker FROM Boeken
UNION
SELECT 'Films', FilmId, Titel, Regisseur FROM Films
ORDER BY Maker
Dit gaat vaak mis. 'boeken' wordt dan geinterpreteert als een char(6) veld terwijl 'Films' een char(5) veld is. En dat komt dan niet overeen....

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In MySQL dan misschien, in SQL Server niet, ook niet als de tweede veel langer is.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

P_de_B schreef op vrijdag 02 december 2005 @ 14:59:
In MySQL dan misschien, in SQL Server niet, ook niet als de tweede veel langer is.
Vraag me niet meer welke DB liep te zeuren maar om het probleem voor te zijn gebruik ik nu eigenlijk overal een integer ID.

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
P_de_B schreef op vrijdag 02 december 2005 @ 14:59:
In MySQL dan misschien, in SQL Server niet, ook niet als de tweede veel langer is.
In MySQL werkt het ook gewoon. (Maakt zelfs niet uit of een veld integer of varchar is)

Versie 4.1.11 iig.

SQL:
1
2
3
4
5
SELECT 'test' AS hoi
UNION
SELECT 'testje enzo'
UNION
SELECT 554343245 
^ geeft geen error, geeft gewoon netjes de verwachte output.

Verwijderd

Het kan overigens qua performance beter zijn om een UNION ALL te gebruiken, ipv alleen een UNION. De distinct wordt dan namelijk niet uitgevoerd.

  • hobbeldebobbel
  • Registratie: Februari 2001
  • Laatst online: 15-02-2023
SQL:
1
2
3
4
SELECT archi_foto.bestand as 'nummer' , datup, 'F' as 'waarvan' FROM archi_foto
UNION
SELECT archi_books.id as 'nummer', datup, 'B' as 'waarvan' FROM archi_books
ORDER BY datup DESC


dit ishet geworden en het werkt :)
slechts drie broodnodige dingen inlezen:
1) nummer: een uniek ID of een md5 hash voor een foto of een volgnummer voor een boek
2) datup: waarop mooi gesorteerd kan worden
3) waarvan: b/f oftewel een Boek of een Foto

de array doorlopen met {
PHP:
1
2
3
4
5
6
7
8
9
10
11
while ($arr = mysql_fetch_array($res)) {
if($arr['waarvan'] == 'B'){
//boek 
show_book_row();
};
if($arr['waarvan'] == 'f'){
//boek 
show_foto_row();
};

};


en dan aan de ahand van $arr['waarvan'] twee verschillende functies aanroepen et voila opgelost

dank voor de reacties :)

btw ik werk met mysql ;)

[ Voor 10% gewijzigd door hobbeldebobbel op 02-12-2005 16:46 ]

hier zou een slimme opmerking kunnen staan
maar die staat er niet

Pagina: 1