Suchabfrage möglichst schnell

Suchabfrage möglichst schnell

am 15.12.2006 12:12:01 von GreenRover

CREATE TABLE `anz_vari_anz` (
`anz` int(8) unsigned NOT NULL default '0',
`vari` int(5) unsigned NOT NULL default '0',
`zahl` float default NULL,
`string` varchar(255) default NULL,
`text` text,
KEY `anz` (`anz`),
KEY `string` (`string`),
KEY `zahl` (`zahl`),
FULLTEXT KEY `text` (`text`)
) TYPE=MyISAM;

--
-- Daten für Tabelle `anz_vari_anz`
--

INSERT INTO `anz_vari_anz` VALUES (1, 5, NULL, 'asu', NULL);
INSERT INTO `anz_vari_anz` VALUES (1, 5, NULL, 'tüv', NULL);
INSERT INTO `anz_vari_anz` VALUES (1, 3, NULL, '6', NULL);
INSERT INTO `anz_vari_anz` VALUES (1, 7, 0, 'CHF', '15000,00');
INSERT INTO `anz_vari_anz` VALUES (1, 6, NULL, NULL, 'ist ein Fiat, der
ist ohne');
INSERT INTO `anz_vari_anz` VALUES (1, 1, NULL, 'blau', NULL);
INSERT INTO `anz_vari_anz` VALUES (15, 1, NULL, 'grün', NULL);
INSERT INTO `anz_vari_anz` VALUES (15, 6, NULL, NULL, 'ABS,
Zentralverriegelung, el. Wegfahrsperre, Anhängerkupplung, el.
Fensterheber ');
INSERT INTO `anz_vari_anz` VALUES (15, 7, 4, 'EUR', '6,85');
INSERT INTO `anz_vari_anz` VALUES (15, 3, NULL, '6', NULL);
INSERT INTO `anz_vari_anz` VALUES (15, 5, NULL, 'tüv', NULL);
INSERT INTO `anz_vari_anz` VALUES (15, 5, NULL, 'asu', NULL);
INSERT INTO `anz_vari_anz` VALUES (16, 1, NULL, 'rot', NULL);
INSERT INTO `anz_vari_anz` VALUES (16, 6, NULL, NULL, 'ABS,
Zentralverriegelung, Tempomat, el. Wegfahrsperre, Schiebedach, el.
Fensterheber');
INSERT INTO `anz_vari_anz` VALUES (16, 7, 1, 'EUR', '2,00');
INSERT INTO `anz_vari_anz` VALUES (16, 3, NULL, '5', NULL);
INSERT INTO `anz_vari_anz` VALUES (16, 5, NULL, 'tüv', NULL);
INSERT INTO `anz_vari_anz` VALUES (16, 5, NULL, 'asu', NULL);
INSERT INTO `anz_vari_anz` VALUES (17, 7, 9579, 'EUR', '15450,00');
INSERT INTO `anz_vari_anz` VALUES (17, 6, NULL, NULL, 'ABS,
Stabilitätskontrolle, Zentralverriegelung, Tempomat, el. Wegfahrsperre,
el. Fensterheber , Garantie');
INSERT INTO `anz_vari_anz` VALUES (17, 1, NULL, 'metalic', NULL);
INSERT INTO `anz_vari_anz` VALUES (17, 3, NULL, '5', NULL);
INSERT INTO `anz_vari_anz` VALUES (17, 5, NULL, 'tüv', NULL);
INSERT INTO `anz_vari_anz` VALUES (17, 5, NULL, 'asu', NULL);
INSERT INTO `anz_vari_anz` VALUES (19, 1, NULL, 'schwarz', NULL);
INSERT INTO `anz_vari_anz` VALUES (19, 6, NULL, NULL, 'ABS,
Stabilitätskontrolle, Zentralverriegelung, el. Wegfahrsperre, el.
Fensterheber ');
INSERT INTO `anz_vari_anz` VALUES (19, 7, 6975, 'EUR', '11250,00');
INSERT INTO `anz_vari_anz` VALUES (19, 3, NULL, '3', NULL);
INSERT INTO `anz_vari_anz` VALUES (19, 5, NULL, 'tüv', NULL);
INSERT INTO `anz_vari_anz` VALUES (19, 5, NULL, 'asu', NULL);
INSERT INTO `anz_vari_anz` VALUES (20, 1, NULL, 'silber metal', NULL);
INSERT INTO `anz_vari_anz` VALUES (20, 6, NULL, NULL, 'ABS,
Einparkhilfe, Zentralverriegelung, el. Wegfahrsperre,
Leichtmetallfelgen, Navigationssystem, el. Fensterheber ');
INSERT INTO `anz_vari_anz` VALUES (20, 7, 10478, 'EUR', '16900,00');
INSERT INTO `anz_vari_anz` VALUES (20, 3, NULL, '5', NULL);
INSERT INTO `anz_vari_anz` VALUES (20, 5, NULL, 'tüv', NULL);


Ist es möglich mit einem Query alle `anz` zu bekommen wo folgendes stimmt:
`vari` = 5 `string` = 'tüv'
`vari` = 5 `string` = 'asu'
`vari` = 3 `string` = '5'
`vari` = 7 `zahl` <= 10000

Es ist bei bestimmten Varianten möglich, das sie mehrfach, mit
unterschiedlichen Werten, vergeben sind pro Anzeige.


Momentan lasse ich alle Varianten einzelnd durchsuchen und gucke mit PHP
welche anzeigen in allen suchen gefunden wurden.

Re: Suchabfrage möglichst schnell

am 15.12.2006 17:07:06 von newsgroup

> Heiko (GreenRover) Henning schrieb:
>>
>>
> Ist es möglich mit einem Query alle `anz` zu bekommen wo folgendes stimmt:
>> `vari` = 5 `string` = 'tüv'
>> `vari` = 5 `string` = 'asu'
>> `vari` = 3 `string` = '5'
>> `vari` = 7 `zahl` <= 10000

Hy,
wieso versuchst Du es nicht mit

select distinct anz
from tabelle
where ( vari = 5 and string in ('tüv','asu') )
or ( vari = 3 and string = '5' )
or ( vari = 7 and zahl <= 10000 )

>> Es ist bei bestimmten Varianten möglich, das sie mehrfach, mit
>> unterschiedlichen Werten, vergeben sind pro Anzeige.

Hä???, den Satz verstehe ich nicht....
(Es ist möglich, dass das Gleiche mehrmals vorkommt, nur eben
unterschiedlich....)


Gruß,
Michael

Re: Suchabfrage möglichst schnell

am 15.12.2006 19:27:45 von GreenRover

Michael König schrieb:

> Hy,
> wieso versuchst Du es nicht mit
>
> select distinct anz
> from tabelle
> where ( vari = 5 and string in ('tüv','asu') )
> or ( vari = 3 and string = '5' )
> or ( vari = 7 and zahl <= 10000 )
>
Hätte das Problem, das es jeweils raus sucht.
Und nicht eine `anz` wo alle Bedingungen erfüllt werden.

Re: Suchabfrage möglichst schnell

am 15.12.2006 19:54:24 von Helmut Chang

Heiko (GreenRover) Henning schrieb:
> Michael König schrieb:
>
>> Hy,
>> wieso versuchst Du es nicht mit
>>
>> select distinct anz
>> from tabelle
>> where ( vari = 5 and string in ('tüv','asu') )
>> or ( vari = 3 and string = '5' )
>> or ( vari = 7 and zahl <= 10000 )
>>
> Hätte das Problem, das es jeweils raus sucht.
> Und nicht eine `anz` wo alle Bedingungen erfüllt werden.

Ich glaube zu wissen, was du meinst. Du suchst den Wert in der Spalte
`anz`, bei dem alle Bedingungen zutreffen. Das geht schon, allerdings
scheint es mir ein wenig krank:

SELECT anz
FROM tabelle t1
JOIN tabelle t2 USING(anz)
JOIN tabelle t3 USING(anz)
WHERE t1.vari = 5 AND t1.string IN ('tüv', 'asu')
AND t2.vari = 3 AND t2.string = '5'
AND t3.vari = 7 AND t3.zahl <= 10000

oder:

SELECT anz
FROM tabelle
WHERE vari = 5
AND string IN ('tüv','asu')
AND anz IN (SELECT anz
FROM tabelle
WHERE...
AND anz IN (SELECT...

Oder in Prosa ausgedrückt:

Du holst die Menge an Werten für `anz`, bei denen die erste Bedingung
zutrifft.

Aus dieser Menge filterst du jetzt die aus, bei denen die zweite
Bedingung nicht zutrifft.

Aus den übriggebliebenen filterst du die aus,...

gruss, heli

Re: Suchabfrage möglichst schnell

am 15.12.2006 20:12:46 von newsgroup

Heiko (GreenRover) Henning schrieb:
> Michael König schrieb:
>
>
>>Hy,
>>wieso versuchst Du es nicht mit
>>
>>select distinct anz
>>from tabelle
>>where ( vari = 5 and string in ('tüv','asu') )
>>or ( vari = 3 and string = '5' )
>>or ( vari = 7 and zahl <= 10000 )
>>
>
> Hätte das Problem, das es jeweils raus sucht.
> Und nicht eine `anz` wo alle Bedingungen erfüllt werden.

Na, diese etwas gewöhnungsbedürftige Anforder konnte ich wirklich nicht
erahnen.

Das versuch es z.B.: mit

select anz from tabelle t1
where exists ( select 1 from tabelle t2 where t1.anz = t2.anz
and vari = 5
and string in ('tüv', 'asu') )
and exists ( )
and exists ( )

Ich möchte eigentlich nicht fragen, aber hast Du Dir Dein Datenmodell
mal kritisch auf Verbesserungspotential hin
angeschaut? Ich möchte wetten, da ist was zu machen.....

Michael

Re: Suchabfrage möglichst schnell

am 19.12.2006 12:09:57 von GreenRover

Michael König schrieb:
> Na, diese etwas gewöhnungsbedürftige Anforder konnte ich wirklich nicht
> erahnen.
>
> Das versuch es z.B.: mit
>
> select anz from tabelle t1
> where exists ( select 1 from tabelle t2 where t1.anz = t2.anz
> and vari = 5
> and string in ('tüv', 'asu') )
> and exists ( )
> and exists ( )
Das liest sich ganz gut und dürfte wohl auch das schnellst sein.
Ich komme aber leider dieses Jahr nicht mehr zu ausführlichen Testreihen.

> Ich möchte eigentlich nicht fragen, aber hast Du Dir Dein Datenmodell
> mal kritisch auf Verbesserungspotential hin
> angeschaut? Ich möchte wetten, da ist was zu machen.....
Du das Datenmodell ist erst neu und wir haben sogar zu 3te über Vor und
Nachteile unterschiedlicher Modelle nachgedacht und sind bei diesem
gelandet, da uns einfach kein ideales eingefallen ist.
Da ja auf eine Anzeige multiple und wechselnde Variationen geben muß,
welche dazu noch unterschiedliche Datentypen haben.

Oder fällt dir das auf Anhieb eine Bessere Lösung ein?

Alles in einer Tabelle zu haben, ist an Hand der vorgesehen Datenmenge
nicht so ideal.
Also wird extrem ungünstig, wenn eine Spalte mal ausgetauscht werden soll.

Für jeden DatenType eine eigene Tabelle, war mir pers zu viel
Aufteilung. also zu viele Abfrage in der Einzelanzeige.

Re: Suchabfrage möglichst schnell

am 19.12.2006 16:06:58 von GreenRover

Michael König schrieb:
> select anz from tabelle t1
> where exists ( select 1 from tabelle t2 where t1.anz = t2.anz
> and vari = 5
> and string in ('tüv', 'asu') )

geht leider nicht, der MySQL4 Server kann das noch nicht, mit den
verschachtelten Abfragen.

Re: Suchabfrage möglichst schnell

am 19.12.2006 20:06:09 von dnoeth

Heiko (GreenRover) Henning wrote:

>> select distinct anz
>> from tabelle
>> where ( vari = 5 and string in ('tüv','asu') )
>> or ( vari = 3 and string = '5' )
>> or ( vari = 7 and zahl <= 10000 )
>>
> Hätte das Problem, das es jeweils raus sucht.
> Und nicht eine `anz` wo alle Bedingungen erfüllt werden.

Dann mach das doch einfach:

select anz
from tabelle
where ( vari = 5 and string in ('tüv','asu') )
or ( vari = 3 and string = '5' )
or ( vari = 7 and zahl <= 10000 )
group by anz
having count(*) = 4

Dieter