[SQL/Datenbanken] *Neues Problem* - Concat - Join mit WHERE not in ?

Johnson

Code-Frevler
ID: 118054
L
20 April 2006
859
53
Hi,


-- Neues Problem Hier --

ich habe hier folgende Tabellen (als anschauliches Beispiel - Sinn ist erstmal nicht weiter von Bedeutung ;) ):

## mail_user ##
einheitenid (Fremdschlüssel aus mail_data)
mail_owner_id
...

## mail_data ##
id (Primärschlüssel)
typ (int)

Nun möchte ich folgendes in einer Query haben:

- Gegeben ist eine ID aus mail_data
- Nun will ich alle anderen IDs aus mail_data haben, die den gleichen Typ wie die gegebene ID haben [Hier mal in 2 Queries: SELECT typ FROM mail_data WHERE id = 123 - SELECT id FROM mail_data WHERE typ = 123]
- Mit allen gefundenen IDs überprüfen, ob irgendeine dieser IDs in der Tabelle mail_user mit einer gegebenen mail_ownerid vorkommt [Query: SELECT id FROM mail_user WHERE einheitenid IN (1, 2, 3, 4, ...) AND mail_owner_id = 123]


Vielleicht habe ich auch nur einen Hänger; auf jeden Fall gelingt es mir nicht das ganze in 1 Query zu packen.


Gruß + thx
 
Zuletzt bearbeitet:
Musst ne Subquery (erfordert MySQL v>=4.1) machen:
Ohne Garantie (ich benutz lokal immer noch v3.23.49 :biggrin: )

SELECT id FROM mail_user WHERE einheitenid IN (SELECT typ FROM mail_data WHERE id = 123) AND mail_owner_id = 123
 
theHacker schrieb:
Musst ne Subquery (erfordert MySQL v>=4.1) machen:
Ohne Garantie (ich benutz lokal immer noch v3.23.49 :biggrin: )

SELECT id FROM mail_user WHERE einheitenid IN (SELECT typ FROM mail_data WHERE id = 123) AND mail_owner_id = 123

Hi, erstmal danke ...

Eigentlich wollte ich gerade um die Subquery drumrumkommen ...

Und das liefert ja auch nicht das gewünschte Ergebnis (SELECT typ FROM mail_data WHERE id = 123 - da ist die ID ja auf 123 beschränkt. Ich will aber den Typ der Einheitenid auslesen und dann alle anderen einheitenids der anderen Typen ....

Gruß
 
wie wäre es mit

Code:
SELECT id FROM mail_user U, mail_data D WHERE U.id= D.typ AND U.id = U.mail_owner_id;
 
NightWalk3r schrieb:
wie wäre es mit

Code:
SELECT id FROM mail_user U, mail_data D WHERE U.id= D.typ AND U.id = U.mail_owner_id;

Der passt von der Logik auch nicht ... Musst oben nochmal genau lesen - ich hoffe ich habe es verständlich beschrieben ...

Gruß
 
kannst du das dann mal in ein ER model packen ?
oder deinen 3. punkt näher erklären was damit meinst
 
NightWalk3r schrieb:
kannst du das dann mal in ein ER model packen ?
oder deinen 3. punkt näher erklären was damit meinst

In ein ER Modell nicht, aber ich kanns hier nochmal kurz schriftlich erklären ;)

mail_user - einheitenid ist der Fremdschlüssel zum Primärschlüssel (id) auf Maildata.
mail_user - mail_owner_id ist eine beliebige ID (hier ist die Relation zum Lösen des Probs denke ich nicht wichtig)
mail_data - id ist der Primärschlüssel
mail_data - typ ist ein int-Feld mit irgendeiner Zahl.

Ein Typ kann mehrere IDs umfassen (mail_data.id - mail_data.typ) / 1 : n Relation.

Ich kann dir das ganze mal in Code listen - allerdings ist das so ja arg umständlich und unschön ;)

PHP:
$abfrage = $db->queryf("SELECT typ FROM mail_data WHERE id = %d",DIE_EINHEITENID);

/* Auswertung, Typ in $typ einlesen */

$abfrage = $db->queryf("SELECT id FROM mail_data WHERE typ = %d",$typ);

/* Nun sämtliche IDs in einen String ($ids) mit 'komma' getrennt packen (Bsp: 1,2,3) */

$abfrage = $db->queryf("SELECT irgendwas FROM mail_user WHERE mail_owner_id = %d AND einheitenid IN ('%s')",123,$ids);

/* Nun hab ich mein gewünschtes Ergebnis ... */

Nun suche ich eine Query, die mir dies erfüllen kann, da ich hier einfach hänge .. :)
 
Code:
SELECT mu.irgendwas
FROM mail_data tmpMD,
	mail_user mu INNER JOIN mail_data md ON ( mu.einheitenid = md.id )
WHERE mail_owner_id = 123
	AND tmpMD.typ = md.typ
	AND tmpMD.id = 1
getestet und funktioniert ;)

 
Moloc schrieb:
Code:
SELECT mu.irgendwas
FROM mail_data tmpMD,
	mail_user mu INNER JOIN mail_data md ON ( mu.einheitenid = md.id )
WHERE mail_owner_id = 123
	AND tmpMD.typ = md.typ
	AND tmpMD.id = 1
getestet und funktioniert ;)



Big thx!

Ist ja wenn ich mir die Query jetzt mal anschaue auch extrem logisch, nur hab ich wohl "etwas" zu kompliziert gedacht!
 
Ich hab nochmal eine kleine Frage / Problem:

Ich möchte eine Tabelle Joinen, deren Namen ich mit CONCAT zusammensetze.

Z.B.: SELECT CONCAT('test',feldname) AS tab2

Da bekomme ich dann als Ergebnis z.B. test_tabxyz. Nun möchte ich eben 'test_tabxyz' joinen. Wie stelle ich das an ? Warscheinlich hab ich in beiden ausprobieren Lösungsmöglichkeiten einen Fehler drinnen, der das unmöglich macht, hier mal meine 2 Versuche:

Code:
SELECT CONCAT('test',name) AS tab2 FROM tab1
LEFT JOIN tab2 ...
Code:
SELECT ... FROM tab 1
LEFT JOIN CONCAT('test',tab1.name) ..

Auf jeden Fall sehe ich keinen Fehler und Dr. Google hat mir bei meinen Suchbegriffen (die wohl nicht besonders geschickt gewählt waren *rotwerd*) auch nicht weitergeholfen (ebenso die Mysql-Doc).

Gruß
 
mit AS änderst du nur die Spaltenüberschrift, das kannst du später nicht im weiteren Query benutzen. Genauswenig kannst du Funktionen ausserhalb des SELECTs (bzw. WHERE, ORDER BY und HAVING) benutzen. Den Tabellennamen musst du dir anders zusammen basteln, und zwar bevor du die Abfrage machst, dynamische Tabellennamen in der Abfrage gehen nicht.

edit: Tastatur klemmt + Vollständigkeit ;)
 
Zuletzt bearbeitet:
Grinch schrieb:
mit AS änderst du nur die Spaltenüberschrift, das kannst du später nicht im weiteren Query benutzen. Genauswenig kannst du Funktionen ausserhalb des SELECTs (bzw. WHERE, ORDER BY und HAVING) benutzen. Den Tabellennamen musst du dir anders zusammen basteln, und zwar bevor du die Abfrage machst, dynamische Tabellennamen in der Abfrage gehen nicht.

edit: Tastatur klemmt + Vollständigkeit ;)

Das mit AS hab ich mittlerweile gemerkt ... Okay, dann mach ich es halt ein bisschen komplizierter, aber trotzdem thx :)