[MySQL] Abfrage von Einträgen in der 2. Tabelle

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo,

ich habe folgendes.
In einer Tabelle "A" stehen einträge...
In einer zweiten Tabelle "B" ebenfalls, diese werden aber aus A generiert.

Nun möchte ich, dass mir alles ausgegeben wird wo der Strink in Tabelle B nicht vor kommt.

Beispiel-Statement:
SELECT * FROM logs AS l WHERE NOT EXISTS ( SELECT * FROM logs_blacklist AS lb WHERE l.msg LIKE %lb.message% AND lb.global = 1 ) AND NOT EXISTS ( SELECT * FROM logs_blacklist AS lb WHERE l.msg LIKE %lb.message% AND l.host = lb.hostaddress AND lb.global = 0)

Wo ist mein Denkfehler?


MFG
Papenburger
 
Nach dem LIKE hast du ein % stehen. Mit dem kann MySQL schätzungsweise nichts anfangen.

Laut https://www.miphp.net/blog/view/MySQL+LIKE+query+using+column+contents soll es mit CONCAT funktionieren.

Desweitern könntest du die zwei subselects zu einem zusammenfassen?

Eventuell geht das so?
PHP:
SELECT *
FROM logs AS l 
WHERE NOT EXISTS (
	SELECT * 
	FROM logs_blacklist AS lb 
	WHERE l.msg LIKE CONCAT('%', lb.message, '%') AND (
		( lb.global = 1 ) OR
		( lb.global = 0 AND l.host = lb.hostaddress )
	)
)
Wenn jedoch eine Menge in den logs und in der blacklist steht, könnte ich mir vorstellen, dass da die Performance nicht die beste ist(?)

Fehlermeldungen etc. wären nett :-?
 
Habe ich Dein Problem richtig verstanden:
Du hast eine Tabelle A mit Einträgen, und möchtest nur die Zeilen anzeigen, bei denen bestimmte Textstrings ( in Tabelle B hinterlegt ) nicht vorkommen ?


Problem ist, dass die meisten SQL-Dialekte nach LIKE keine Spalte akzeptieren, sondern nur eine "non-column-expression" ( also einen Ausdruck, in dem keine Spalte vorkommt ). MySQL wird hier keine Ausnahme machen.


Ein derartiges Konstrukt könnte jedoch klappen:


SELECT A.benötigte-columns
FROM logs A
WHERE A.tabellen-primär-schlüssel IN
( SELECT AA.tabellen-primär-schlüssel
FROM logs AA , blacklist BB
WHERE ( BB.global = 1 ) OR ( BB.global = 0 AND AA.host = BB.hostaddress )
GROUP BY AA.tabellen-primär-schlüssel
HAVING MAX(LOCATE(BB.message,AA.message)) = 0
) ;
 
Zuletzt bearbeitet:
Problem ist, dass die meisten SQL-Dialekte nach LIKE keine Spalte akzeptieren, sondern nur eine "non-column-expression" ( also einen Ausdruck, in dem keine Spalte vorkommt ). MySQL wird hier keine Ausnahme machen.

Der Meinung war ich zuerst auch, bis ich mal bei MySQL nachgeschaut habe:
https://dev.mysql.com/doc/refman/5.1/de/string-comparison-functions.html schrieb:
Das Muster muss kein literaler String sein. Es kann beispielsweise auch als String-Ausdruck oder als Tabellenspalte angegeben werden.
Steht sowohl beim 5.1 Manual wie beim 6.0 in englisch und deutsch. :-?

Aber wie schon erwähnt, ist das sicher keine optimale Lösung.

[edit für ice-breaker]
Ja.. ich hab da nicht geschaut was bei MySQL stable ist und was nicht, jedoch soll es laut MySQL manual in folgenden versionen funktionieren:
MySQL 3.23/4.0/4.1
MySQL 5.0
MySQL 5.1
MySQL 6.0
genauer werde ich das jetzt nicht raussuchen... :roll:
[/edit]
 
Zuletzt bearbeitet:
ach, und er hat 5.1 oder 6 installiert?
Ich wette mal zu 99% dagegen, denn beides sind keine Stable Releases.

Er wirst wahrscheinlich eine 5.0 Version haben.
 
Danke, ich werde das in den nächsten Tagen einmal Testen.
Werd mich dann aber hier auch wiede rzu Wort melden!

Zur Info, folgende Version benutze ich:

# Server Version: 5.0.26-log
# Protokoll-Version: 10
# phpMyAdmin - 2.9.0.2
# MySQL-Client-Version: 5.0.26