Hallo zusammen,
ich hätte hier mal eine Frage zur "SELECT" Optimierung:
ich habe zwei Tabellen:
1. "test_locations" (Liste von verfügbaren Locations):
CREATE TABLE IF NOT EXISTS `test_locations` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(100) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2. "test_termine" (dazugehörige Belegung der Locations):
CREATE TABLE IF NOT EXISTS `test_termine` (
`location_id` int(11) unsigned NOT NULL,
`week` int(10) unsigned default NULL,
`frei` tinyint(1) default '0',
KEY `location_id` (`location_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Tabelle 1 ist 1:n mit Tabelle 2 verknüpft. Für jede Location in Tabelle 1 gibt es n Einträge in Tabelle zwei (Für jede Woche eines Jahres einen Eintrag, der angibt ob diese Woche noch frei ist oder eben nicht).
Nun möchte ich eine Suchanfrage stellen, welche mir zum Beispiel alle Locations auswirft, die von Woche 40-45 frei sind.
Ich habe das ganze mit einem Subquery gelöst:
SELECT
l.*
FROM
test_locations l
WHERE
1
AND 5 = (
SELECT
count(location_id)
FROM
test_termine
WHERE
1
AND
location_id=l.id
AND
week >= 40
AND
week <= 45
AND
frei=1
)
Kurze Erläuterung:
Ich suche alle Locations, welche 5 Wochen (Woche 40-45) am Stück frei sind. Also muss es in der Tabelle "test_termine" genau 5 Einträge geben, welche für die genannten Wochen frei sind.
Mein Frage lautet nun:
Kann man diese Aufgabe auch einfacher lösen? Ich denke die Lösung mit Subquery ist viel zu aufwendig und leider nicht die schnellste Lösung - gerade wenn es mehrere 10000 Location gibt.
Vielen Dank
Gruß
waYan
ich hätte hier mal eine Frage zur "SELECT" Optimierung:
ich habe zwei Tabellen:
1. "test_locations" (Liste von verfügbaren Locations):
CREATE TABLE IF NOT EXISTS `test_locations` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(100) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2. "test_termine" (dazugehörige Belegung der Locations):
CREATE TABLE IF NOT EXISTS `test_termine` (
`location_id` int(11) unsigned NOT NULL,
`week` int(10) unsigned default NULL,
`frei` tinyint(1) default '0',
KEY `location_id` (`location_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Tabelle 1 ist 1:n mit Tabelle 2 verknüpft. Für jede Location in Tabelle 1 gibt es n Einträge in Tabelle zwei (Für jede Woche eines Jahres einen Eintrag, der angibt ob diese Woche noch frei ist oder eben nicht).
Nun möchte ich eine Suchanfrage stellen, welche mir zum Beispiel alle Locations auswirft, die von Woche 40-45 frei sind.
Ich habe das ganze mit einem Subquery gelöst:
SELECT
l.*
FROM
test_locations l
WHERE
1
AND 5 = (
SELECT
count(location_id)
FROM
test_termine
WHERE
1
AND
location_id=l.id
AND
week >= 40
AND
week <= 45
AND
frei=1
)
Kurze Erläuterung:
Ich suche alle Locations, welche 5 Wochen (Woche 40-45) am Stück frei sind. Also muss es in der Tabelle "test_termine" genau 5 Einträge geben, welche für die genannten Wochen frei sind.
Mein Frage lautet nun:
Kann man diese Aufgabe auch einfacher lösen? Ich denke die Lösung mit Subquery ist viel zu aufwendig und leider nicht die schnellste Lösung - gerade wenn es mehrere 10000 Location gibt.
Vielen Dank
Gruß
waYan
Kommentar