EXISTS i MySQL
Jeg har tit en en-til-mange datastruktur når jeg fx arbejder med ting der har vedhæftet billeder. Det kan fx være på BedsteVen.dk, hvor brugerne kan have flere billeder på deres dyr eller annoncer.
På forsiden af BedsteVen.dk viser jeg nogle tilfældige dyr, men jeg vil kun vise de dyr der indeholder billeder. Min struktur er noget lignende (meget simplificeret):
Først tabellen med dyrene:
1 2 3 4 5 | CREATE TABLE item ( itemid INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY (itemid) ) ENGINE = MYISAM; |
Så tabellen med billederne:
1 2 3 4 5 | CREATE TABLE image ( imageid INT UNSIGNED NOT NULL AUTO_INCREMENT, path VARCHAR(255) NOT NULL, PRIMARY KEY(imageid) ) ENGINE = MYISAM; |
Til sidst tabellen der binder dyr og billeder sammen:
1 2 3 4 5 | CREATE TABLE items_and_images ( itemid INT UNSIGNED NOT NULL, imageid INT UNSIGNED NOT NULL, PRIMARY KEY(itemid, imageid) ) ENGINE=MyISAM; |
Så hælder vi data i tabellerne:
1 2 | INSERT INTO item (itemid, name) VALUES (1, 'Alfa'), (2, 'Beta'), (3, 'Charlie'), (4, 'Delta'), (5, 'Echo'), (6, 'Foxtrot'); |
1 2 3 4 5 6 | INSERT INTO image (imageid, path) VALUES (1, 'images/001.png'), (2, 'images/002.png'), (3, 'images/003.png'), (4, 'images/004.png'), (5, 'images/005.png'), (6, 'images/006.png'), (7, 'images/007.png'), (8, 'images/008.png'), (9, 'images/009.png'), (10, 'images/010.png'); |
1 2 3 | INSERT INTO items_and_images (itemid, imageid) VALUES (1, 1), (1, 2), (1, 3), (1, 4), (2, 5), (2, 6), (3, 7), (3, 8), (3, 9), (3, 10); |
For at hente navnet ud fra item-tabellen på alle de rækker hvor den pågældende række var i items_and_images brugte jeg EXISTS, og SQL’en blev som følgende:
1 2 3 4 | SELECT name FROM item WHERE EXISTS (SELECT imageid FROM image LEFT JOIN items_and_images AS iai USING(imageid) WHERE iai.itemid = item.itemid); |
Hvilket gav navnene: Alfa, Beta og Charlie :-)
Fidusen ved EXISTS er, at den returnerer true hvis dens argument returnerer rækker. Argumentet til EXISTS skal derfor være en subselection.

Jeg hedder Morten, og jeg har udviklet webapplikationer siden slutningen af 90'erne.