Gewichtete SQL-Anfrage

Hallo liebe leute,

folgendes problem:
ich würde gerne eine gewichtete abfrage erstellen ähnlich wie die volltextsuche, allerdings möchte ich die abfrage genauer haben und nicht stopworter filtern. die idee, die ich hatte war

SELECT id FROM tabelle WHERE feld LIKE ‚%suchwort1%‘
UNION ALL
SELECT id FROM tabelle WHERE feld LIKE ‚%suchwort2%‘
UNION ALL

das ergebnis war auch schon nicht schlecht. allerdings kann ich die daten nicht weiterverarbeiten. was mir fehlt, ist ein COUNT(id) und ORDER BY id

hat da jemand eine idee wie ich die SELECTs zusammenfassen kann?

lg Stefan

Hallo liebe leute,

folgendes problem:
ich würde gerne eine gewichtete abfrage erstellen ähnlich wie
die volltextsuche, allerdings möchte ich die abfrage genauer
haben und nicht stopworter filtern. die idee, die ich hatte
war

  • In welcher DB ? Version ?

Gruss

Hi Stefan,

hat da jemand eine idee wie ich die SELECTs zusammenfassen
kann?

mach eine View daraus, dann kannst Du sortieren und gruppieren.

Gruß Ralf

Hallo Stefan,

ehrlich gesagt bin ich mir nicht ganz sicher, ob ich deine Frage richtig verstanden habe (insbesondere kann ich mit „gewichtete“ Anfrage nichts anfangen), aber meinst du vielleicht sowas hier?

SELECT id, COUNT(id) 
 FROM tabelle 
 WHERE feld LIKE '%suchwort1%' OR
 feld LIKE '%suchwort2%' OR
 ...
 GROUP BY id
 ORDER BY id;

Gruß
Martin

Hi!

Ich würde aus Performancegründen eher sowas machen:

select id,count(id)
 from (
 SELECT id
 FROM tabelle
 WHERE feld LIKE '%suchwort1%'
 UNION ALL
 SELECT id
 FROM tabelle
 WHERE feld LIKE '%suchwort2%'
 ...
 )
 GROUP BY id
 ORDER BY id;

Grüße,
Klugscheiß-Tomh

Hi,
das liefert aber nicht das gleiche Ergebnis und vermutlich braucht es auch noch länger, verletzt also drei von drei Regeln des tunens:

  1. don’t tune
  2. stelle sicher, dass getunete und ursprüngliche Version des Codes das selbe Ergebnis haben
  3. stelle sicher, dass die getunete Version das Tuningziel erreicht.

Jens

Hi!

das liefert aber nicht das gleiche Ergebnis

stimmt, es fehlen die DISTINCTS im übergeordneten select (bin am Abend eben ein bißchen schlampig …)

und vermutlich
braucht es auch noch länger

UNION ALL (mit oder ohne DISTINCT ) länger als ein OR? Naja, bei dieser Abfrage (wahrscheinlich große Ergebnismenge und das OR auf das selbe Feld) könnte es sogar sein …

verletzt also drei von drei
Regeln des tunens:

  1. don’t tune

Ich sollte also das letzte Arbeitsjahr streichen, in dem ich eigentlich nur noch getuned habe?

  1. stelle sicher, dass getunete und ursprüngliche Version des
    Codes das selbe Ergebnis haben

Benutze deswegen niemals mehr als 3 SYSDATES oder 4 NVLS auf einer 10g-Datenbank (erstaunlich, wie sich die Ergebnissmenge eines FIRST_ROWS zu einem ALL_ROWS unterscheiden können - ein _kleiner_ Known-Bug, der wieder ein paar Tuning-Maßnahmen zunichte machte)

  1. stelle sicher, dass die getunete Version das Tuningziel
    erreicht.

Na, wenigstens das habe ich in letzter Zeit erreicht …

Tomh

PS: Alleine nur durch das rausschmeissen von ORs kann man tuning-mäßig schon eine Menge erreichen - und wenn’s durch ein UNION ALL sein muß :wink:

Hi Tom,

PS: Alleine nur durch das rausschmeissen von ORs kann man
tuning-mäßig schon eine Menge erreichen - und wenn’s durch ein
UNION ALL sein muß :wink:

Ich widerspreche dir ja nur ungern, aber das ist manchmal so, vielleicht auch oft oder immer oder aber auch gar nicht - kommt nämlich auf ca. 156 andere Faktoren an. Ich hatte da vor nicht allzu langer Zeit mal was geschrieben (auch wenn die Ausgangsfrage eine andere war): http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…

Gruß
Martin

danke: gewichtete SQL-Anfrage
vielen dank erstmal für die vielen antworten :smile:

es sind viele fragen aufgetreten, von denen ich noch einige beantworten möchte.

  • zu nächst mal die version: mysql - 4.1.20 community nt

  • zu or bzw. gewichtete anfrage:
    gewichtet meint hier, dass ich ‚zähle‘ wiviele der suchworte vorkommen. dafür reicht das or leider nicht aus, da ich hier immer nur einen datensat bekomme. (letzendlich will ich ja gleiche datensätze zählen)

  • select … from (select …):
    das hat bei mir leider nicht funktioniert, war auch meine erste idee :frowning:

den rest werd ich gleich mal ausprobieren

danke nochmal
Stefan

Hi Martin!

Das alles glaub ich Dir auch, aber das entscheidende Wörtchen ist hier das „ALL“ nach dem „UNION“ - wenn ich dann auch noch eine geringe Ergebnismenge bekomme und so ein „SELECT DISTINCT“ drüberstülpen kann, bin ich um ein Hauseck schneller - aber es kommt eben auf das Ganze drumherum auch an, wieviele Tabellen mitverjoint werden, usw. - leider gibt es keine Patentlösung hier - wobei ich verschachtelte Selects immer mehr bevorzuge …

Grüße,
Tomh

ok, so funktionierts :smile: danke nochmal

SELECT id,count(id)
FROM (
SELECT id
FROM kategorie_lookup
WHERE kategorie LIKE ‚%suchwort1%‘
UNION ALL
SELECT id
FROM kategorie_lookup
WHERE kategorie LIKE ‚%suchwort1%‘

) as a
GROUP BY a.id
ORDER BY a.id;

eigentlich hatte ich es auch schon so ähnlich probiert aber bei mir wollte es einfach nicht funktionieren :frowning: