[mysql] Zoeken in meerdere tabellen met zelfde kolomnamen

Pagina: 1
Acties:
  • 1.123 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 14:53

F.West98

Alweer 16 jaar hier

Topicstarter
Hallo,
Ik zit met een klein probleem hoe ik iets moet opzetten. Ik heb een database met publicaties. Deze zijn opgedeeld in 5 tabellen, elke tabel is een categorie. De categorieën worden apart op de pagina gezet, met een kop ertussen. Elke tabel bestaat uit 2 kolommen: Jaar en Publicatie.
Jaar is het jaar waarin de publicatie is gepubliceerd. Hierop sorteer ik, nieuwste bovenaan. Allemaal goed en wel, ik heb nu de amateuristische oplossing dat ie elke tabel apart ophaalt en echo't. :X
Maar omdat ik een zoekfunctie wil gaan inbouwen, moet ik dat veranderen. Join lijkt mij onhandig, want de tabellen hebben niets met elkaar te maken.
Nu lijkt mij het handigste (maar of dat kan) om het zo op te halen:
SQL:
1
SELECT * FROM `tabel1`, `tabel2`, `tabel3`, `tabel4`, `tabel5`

Maar is het dus mogelijk om dezelfde kolommen in meerdere tabellen op te halen? Hoe kies ik bij het echo'en het jaar van tabel3?

Dan wil ik gaan zoeken, dmv WHERE tekst LIKE '%QUERY%'. Kan je dus gewoon de volgende code maken?
SQL:
1
SELECT * FROM `tabel1`, `tabel2`, `tabel3`, `tabel4`, `tabel5` WHERE `publicatie` LIKE '%Query%'

Blijven de categorieën dan gescheiden? Dus dezelfde vragen als hierboven.

Sorteren:
Ik kan dus gewoon als ik wil sorteren het volgende doen?
SQL:
1
SELECT * FROM `tabel1`, `tabel2`, `tabel3`, `tabel4`, `tabel5` WHERE `publicatie` LIKE '%Query%' SORT BY `Jaar` ASC


Allemaal ingewikkelde vragen, ik hoop dat het duidelijk is. Nog even een verduidelijking:

Tabel 1
JaarPublicatie
2011Het boek over MySQL
1998Het boek over PHP


Tabel 2
zelfde indeling, andere publicaties

Tabel 3
,,

Tabel 4
,,

Tabel 5
,,

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Union, evt. Icm een view waar je dan de where op los laat.
Los van het feit dat je db model ruk is :P

[ Voor 35% gewijzigd door RobIII op 23-11-2011 19:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 04-07 15:03

NMe

Quia Ego Sic Dico.

Als je een tabel per categorie hebt dan heb je niet goed op zitten letten bij het hoofdstukje normalisatie en zou ik eerst dat maar eens doornemen voordat ik een query voor dit model in elkaar ging hacken.

Verder heb je ook bij het hoofdstuk joins niet opgelet, want je zegt in de ene zin dat joins je onhandig lijken omdat de tabellen niets met elkaar te maken hebben, en direct in de regel eronder heb je een stuk code met vier impliciete cross joins. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 15:31
Met ^^
Kijk ook wat je met sql kan.

Het is goed mogelijk om kolommen met dezelfde namen uit meerdere tabellen te selecteren.
Dat kan door:
  1. De tabelnaam te prependen
  2. De tabelalias te prependen
Doe je dat niet, dan wordt je query niet uitgevoerd.

Dus:
SQL:
1
2
select tabel1.jaar, other.jaar, tabel1.description, other.description
from tabel1, tabel2 as other

Het gaat echter fout omdat er geen relatie tussen tabel1 en tabel2 is (zoals je zelf ook al zegt).
Wat de server dan doet is ze samenvoegen: tabel1tabel2
Dus tabel1 heeft 2 regels, tabel2 heeft 3 regels = het resultaat heeft 6 regels.

Data die hetzelfde is, maar uit andere tabellen kun je samenvoegen d.m.v. UNION
SQL:
1
2
3
4
5
6
7
8
select jaar, description
from tabel1
where description = 'bla'
union
select jaar, description
from tabel2
where description = 'bla'
order by jaar

let the past be the past.


Acties:
  • 0 Henk 'm!

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 14:53

F.West98

Alweer 16 jaar hier

Topicstarter
NMe schreef op woensdag 23 november 2011 @ 19:23:
Als je een tabel per categorie hebt dan heb je niet goed op zitten letten bij het hoofdstukje normalisatie en zou ik eerst dat maar eens doornemen voordat ik een query voor dit model in elkaar ging hacken.

Verder heb je ook bij het hoofdstuk joins niet opgelet, want je zegt in de ene zin dat joins je onhandig lijken omdat de tabellen niets met elkaar te maken hebben, en direct in de regel eronder heb je een stuk code met vier impliciete cross joins. 8)7
Dankzij jou bedenk ik dat ik ook een 3e kolom kan maken: categorie, daar de categorie in zet en dan alles in 1 tabel doe... Dan gaat zoeken makkelijker, maar dan weer: hoe zet ik dan de dingen uit 1 categorie ergens anders neer dan de andere?
NMe schreef op woensdag 23 november 2011 @ 19:23:
Als je een tabel per categorie hebt dan heb je niet goed op zitten letten bij het hoofdstukje normalisatie en zou ik eerst dat maar eens doornemen voordat ik een query voor dit model in elkaar ging hacken.

Verder heb je ook bij het hoofdstuk joins niet opgelet, want je zegt in de ene zin dat joins je onhandig lijken omdat de tabellen niets met elkaar te maken hebben, en direct in de regel eronder heb je een stuk code met vier impliciete cross joins. 8)7
Ik zat maar iets te proberen, leek me te voor de hand liggend. (en dat is bevestigd)
SPee schreef op woensdag 23 november 2011 @ 19:51:
Met ^^
Kijk ook wat je met sql kan.

Het is goed mogelijk om kolommen met dezelfde namen uit meerdere tabellen te selecteren.
Dat kan door:
  1. De tabelnaam te prependen
  2. De tabelalias te prependen
Doe je dat niet, dan wordt je query niet uitgevoerd.

Dus:
SQL:
1
2
select tabel1.jaar, other.jaar, tabel1.description, other.description
from tabel1, tabel2 as other

Het gaat echter fout omdat er geen relatie tussen tabel1 en tabel2 is (zoals je zelf ook al zegt).
Wat de server dan doet is ze samenvoegen: tabel1tabel2
Dus tabel1 heeft 2 regels, tabel2 heeft 3 regels = het resultaat heeft 6 regels.

Data die hetzelfde is, maar uit andere tabellen kun je samenvoegen d.m.v. UNION
SQL:
1
2
3
4
5
6
7
8
select jaar, description
from tabel1
where description = 'bla'
union
select jaar, description
from tabel2
where description = 'bla'
order by jaar
Dat lijkt de oplossing! Ik ga me erin verdiepen

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
F.West98 schreef op woensdag 23 november 2011 @ 20:28:
Dat lijkt de oplossing! Ik ga me erin verdiepen
Nee, dat is geen oplossing maar een workaround voor een gaar DB model; precies zoals ik zei.

Je kunt een view maken waarin je alle 5 tabellen union-ed en daarmee een 'virtuele nieuwe tabel' maakt die z'n data uit alle 5 onderliggende tabellen haalt:
SQL:
1
2
3
4
5
6
create view myview as
select foo, bar from table1
union
select foo, bar from table2
union
...

en vervolgens een: select foo, bar from myview where foobar = 'baz' doen. Maar beter stop je gewoon alle 5 tabellen in 1 tabel met een extra categorie-veld. Als je dan alle publicaties wil hebben van een bepaald type doe je gewoon een select foo, bar from mytable where catid = 3. En zo hoort 't. Normaliseren.

[ Voor 20% gewijzigd door RobIII op 23-11-2011 20:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 14:53

F.West98

Alweer 16 jaar hier

Topicstarter
RobIII schreef op woensdag 23 november 2011 @ 20:36:
[...]

Nee, dat is geen oplossing maar een workaround voor een gaar DB model; precies zoals ik zei.

Je kunt een view maken waarin je alle 5 tabellen union-ed en daarmee een 'virtuele nieuwe tabel' maakt die z'n data uit alle 5 onderliggende tabellen haalt:
SQL:
1
2
3
4
5
6
create view myview as
select foo, bar from table1
union
select foo, bar from table2
union
...

en vervolgens een: select foo, bar from myview where foobar = 'baz' doen. Maar beter stop je gewoon alle 5 tabellen in 1 tabel met een extra categorie-veld. Als je dan alle publicaties wil hebben van een bepaald type doe je gewoon een select foo, bar from mytable where catid = 3. En zo hoort 't. Normaliseren.
daar ga ik dan op over. Maar stel ik doe dan mysql_fetch_object van de query... wacht.
Ik doe dus dan eigenlijk 5x een select. Dat is toch hartstikke vertragend? Je kan dan beter alles ophalen, en dan krijg je het: hoe selecteer je uit alles dan enkel categorie = 3. Je hebt $query = mysql_query($key)' gedaan. Hoe echo je dan enkel de dingen met categorie 3, gesorteerd op jaar van nieuw naar oud? Makkelijkste is dan toch 5x select doen. Maar dat is tijdrovend... Ik snap het dus niet meer :P

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dan is het hoog tijd voor een basiscursus SQL; zoals ik al vaker heb aangegeven: we verwachten wel een klein beetje basiskennis hier. De drempel is niet hoog maar is er wél. We gaan hier geen handjes houden ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.