[MySQL] UNION / JOIN query beter schrijven

Pagina: 1
Acties:

  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Hallo,

Ik wil een scriptje maken dat gebruik maakt van een aantal MySQL-tabellen. Met het script kunnen links aan een pagina worden toegevoegd. Deze kunnen worden gekozen uit een vast aanbod aan keuzes, of handmatig worden toegevoegd.

Nu wil ik de links met één query selecteren. Dit werkt op zich goed:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(
  SELECT naam, url, 0 AS keuze, plaats
  FROM links
  JOIN links_handmatig USING (lid)
)

UNION

(
  SELECT naam, url, 1 AS keuze, plaats
  FROM links
  JOIN links_gekozen USING (lid)
  JOIN keuzes USING (kid)
)

ORDER BY plaats

Het ziet er alleen nogal omslachtig uit. Kan dit mooier? Ik heb MySQL.com erop nageslagen en heel wat geprobeerd, maar ik kan niks mooiers verzinnen dat nog werkt ook.

Het resultaat moet als volgt zijn:
code:
1
2
3
4
5
naam        url                         keuze   plaats
Mozilla     http://www.mozilla.org/     1       1
Tweakers    http://www.tweakers.net/    1       2
PHP         http://www.php.net/         0       3
MySQL       http://www.mysql.com/       0       4


Voor wie wil testen, hierbij mijn tabellen met inhoud:
code:
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
37
38
39
40
41
42
43
44
45
46
47
48
CREATE TABLE `keuzes` (
  `kid` int(11) NOT NULL auto_increment,
  `naam` varchar(255) NOT NULL default '',
  `url` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`kid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `keuzes` (`kid`, `naam`, `url`) VALUES
(1, 'Google', 'http://www.google.nl/'),
(2, 'Tweakers', 'http://www.tweakers.net/'),
(3, 'Mozilla', 'http://www.mozilla.org/'),
(4, 'Nu.nl', 'http://www.nu.nl/');


CREATE TABLE `links` (
  `lid` int(11) NOT NULL auto_increment,
  `plaats` int(11) NOT NULL default '0',
  PRIMARY KEY  (`lid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `links` (`lid`, `plaats`) VALUES
(1, 3),
(2, 1),
(3, 2),
(4, 4);


CREATE TABLE `links_gekozen` (
  `lid` int(11) NOT NULL default '0',
  `kid` int(11) NOT NULL default '0',
  PRIMARY KEY  (`lid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `links_gekozen` (`lid`, `kid`) VALUES
(2, 3),
(3, 2);


CREATE TABLE `links_handmatig` (
  `lid` int(11) NOT NULL default '0',
  `naam` varchar(255) NOT NULL default '',
  `url` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`lid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `links_handmatig` (`lid`, `naam`, `url`) VALUES
(1, 'PHP', 'http://www.php.net/'),
(4, 'MySQL', 'http://www.mysql.com/');


Alvast bedankt!

[ Voor 6% gewijzigd door Jeeeroen op 18-05-2006 21:11 ]


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Je hebt dus 2 types links, handmatig en gekozen. Laat dat dan terug komen in je datamodel in een veld "type" met de waarde "handmatig" of "gekozen", of 0/1, a/b whatever. ;)

Kan je alles in 1 tabel stoppen en er een simpele query oplos laten.

  • Jeeeroen
  • Registratie: Juni 2004
  • Niet online
Sorry, niet helemaal duidelijk: Het is de bedoeling dat er uiteindelijk meerdere linkpagina's komen van verschillende gebruikers, die wel gebruik maken van de zelfde tabel met keuzes. Jouw oplossing zou dan nogal wat redundantie veroorzaken.