64246
Goto Top

MySQL - Zwei Abfragen in einer?

Hallo,

ich benötige eine Abfrage, die formuliert in zwei Abfragen so wie unten aussehen würde. Sprich selektiere alle Datensätze, deren Wert value1 123 entspricht. Danach suchst Du alle Datensätze, deren value1 dem Ergebniswert der ersten Abfrage entsprechen und zudem Wert value2 = xyz entspricht. Ist eine solche Abfrage möglich?

SELECT wert FROM db WHERE value1 = 123

SELECT id FROM db WHERE value1 = wert AND value2 = xyz


Danke

Content-Key: 96724

Url: https://administrator.de/contentid/96724

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: 36831
36831 11.09.2008 um 19:18:36 Uhr
Goto Top
Moin,

Muss das Zwischenergebnis aus der 1. Abfrage ausgegeben werden und da hinter nochmal die Ergebnisse angezeigt werden, auf die beide Abfragen zutreffen?

Denn sonst wäre das ja IMO einfach
SELECT id, wert FROM db WHERE value1 = '123' AND value2 = 'xyz'

Oder wo habe ich dich falsch verstanden?
Mitglied: 64246
64246 11.09.2008 um 19:39:30 Uhr
Goto Top
Hier mal ein kurzes Beispiel:

Felder in der Tabelle: id element value
Hier zwei Einträge :

1234 broker 221
1235 broker 221
1234 appStatus canceled
1235 appStatus pending

Ausgangslage: Ich möchte wissen, welchen Status die Anfrage(n) des brokers 221 hat/haben.

Dazu müsste zuerst die id (1234 und 1235) ermittelt werden und im Anschluss wird die id zur Bedingung in der Where-Klausel zusammen mit element='appStatus'
Mitglied: 36831
36831 11.09.2008 um 19:58:50 Uhr
Goto Top
Moin,

stehen ID+Name und ID+Element+Value alle in einer Tabelle?

Ich würde folgendes Konzept vorschlagen:

Tabelle Namen:
ID Name
1234 Broker 221
1235 Broker 222

Tabelle Aktionen:
ID Element Status
1234 appStatus canceled
1235 appStatus pending

Die Abfrage, wenn der Name gegeben ist und du den Status wissen möchtest:
SELECT Namen.Name, Aktionen.Status FROM Namen INNER JOIN Aktionen ON Namen.id = Aktionen.id WHERE Namen.Name = 'gewünschterName'

So solltest du weiterkommen. Die Abfrage ist ungetestet und ich habe bisher noch nicht unter MySQL sondern nur unter Firebird Abfragen erstellt. Vielleicht kann ja jemand der MySQL-Admins dazu mehr sagen?

MfG,
VW
Mitglied: Dani
Dani 12.09.2008 um 01:08:57 Uhr
Goto Top
@36831
Bist du dir sicher, dass du einen INNER JÒIN in der selben Tabelle machen willst?!
Ich denke, es geht hier um eine Tabelle - keine Zwei. :-P

@ersteller
Daher sollte es mit einer einfachen SELECT Abfrage getan sein. Siehe ganz oben das 2. Statement.


Gruss,
Dani
Mitglied: 36831
36831 12.09.2008 um 08:05:51 Uhr
Goto Top
@Dani:
Deshalb habe ich darüber ja mein vorgeschlagenes Tabellen-Konzept angegeben, da durch die (nicht) Formatierung der Tabelle im Beispiel nicht ganz klar war, was wo drin steht. face-wink

VW
Mitglied: 64246
64246 12.09.2008 um 08:29:41 Uhr
Goto Top
Hallo,

der Fehler liegt bei mir. Ich hab nicht deutlich genug ausgedrückt und auch noch einen kleinen Fehler verbaut :o)

Die Werte befinden sich alle in einer Tabelle, das Statement

SELECT id, wert FROM db WHERE value1 = '123' AND value2 = 'xyz'

geht in diesem Fall leider nicht, da value2 von mir fehlerhaft als zweites Feld bezeichnet wurde. Value, also den Wert gibt es in jeder Zeile der Tabelle nur einmal. Auf die Zeile mit dem eigentlich gesuchten Wert zugreifen zu können ist zuvor die Ermittlung der id notwendig.

Die Tabelle hat diese Struktur:

id element value

Hier nochmal die Werte:
1234 broker 221
1234 appStatus canceled

1234 entspricht der ID, die beliebieg oft vorkomm, da es möglich sein soll, einem objekt (id) beliebig viele Eigenschaften zuordenen zu können.
broker ist das element und damit ein Bezeichner von vielen, könnte auch postleitzahl heissen. So sähe zum Beispiel die Wertezuweisung in einem Script aus:

1234_Broker = 221
1234_appStatus = canceled
Mitglied: Dani
Dani 12.09.2008 um 10:43:55 Uhr
Goto Top
@36831
Ok...war doch schon etwas später bei mir....face-smile

@64246
Ich verstehe nach 10x lesen immer noch Bahnhof. Entweder denke ich zu kompliziert oder aber es ist eine Nr. zu gross für mich. face-smile


Grüsse,
Dani
Mitglied: it-frosch
it-frosch 12.09.2008 um 10:53:55 Uhr
Goto Top
Hallo,

ich habe das unter Firebird SQL getestet !

So sieht die Lösung für dein Problem aus:
select * from tabelle b where b.id in 
(select a.id from tabelle a where element='broker' and value=221)   
and b.element='appStatus'  

Hier die Erläuterung.

zuerst habe ich mir eine Tabelle angelegt:
Meine 3.Spalte ist ein Integer bei dir aber ein Char(x) !
CREATE TABLE t_test
(
  id integer default NULL,
  element Varchar(10) DEFAULT NULL COLLATE PXW_INTL850,
  wert integer default Null
);
dann die Tabelle mit Werten befüllt:
insert into t_test (id,element,wert) values (1234,'broker',221);  
insert into t_test (id,element,wert) values (1234,'appStatus',33);  
insert into t_test (id,element,wert) values (1235,'broker',221);  
insert into t_test (id,element,wert) values (1235,'test',221);  
insert into t_test (id,element,wert) values (1236,'broker',221);  
insert into t_test (id,element,wert) values (1236,'appStatus',11);  
insert into t_test (id,element,wert) values (1236,'broker',221);  
und dann mit dem Script ausgelesen.

Bei Fragen noch mal melden.
Mitglied: it-frosch
it-frosch 12.09.2008 um 11:18:32 Uhr
Goto Top
Hallo Dani,

Serverpirat hat es etwas 'speziell' ausgedrückt. D.h. ich habe es auch nicht verstanden. face-wink

Die Quintessenz ist nach meinem Verständis:

1. Die Tabelle hat diese Struktur:

id element value

1234 broker 221
1235 broker 221
1234 appStatus canceled
1235 appStatus pending

2.
Ich möchte wissen, welchen wert die Datensätze mit dem element "appStatus"
Das soll nur für Datensätze gelten bei denen das element "broker" den wert 221 hat.
Mitglied: 36831
36831 12.09.2008 um 13:49:23 Uhr
Goto Top
Moin,

nutze doch bitte die Tabellen-Formatierung, dann geht das ganze auch etwas einfacher (steht in der )

Da it-frosch das Insert-Statement aber gepostet hat, bau ich dir die Tabelle einfach mal:

ID Element Wert
1234 broker 221
1234 appStatus 33
1235 broker 221
1235 test 221
1236 broker 221
1236 appStatus 11
1236 broker 221

Die Abfrage hat it-frosch ja auch schon gepostet.

VW
Mitglied: Dani
Dani 12.09.2008 um 14:22:28 Uhr
Goto Top
Wenn wirklich so das Design aussieht, sollten wir uns mal ernsthaft darüber unterhalten bevor wir das Statment feritg machen. WEnn ich da an die Normalisierung so denke (sowas wie die Bibel in der DB-History), hälst du dich an keines der Gesetze. Ganz ehrlich: Irgendwann bricht dir diese Konstellation das Genick.


Gruss,
Dani
Mitglied: 36831
36831 12.09.2008 um 15:27:46 Uhr
Goto Top
Zitat von @Dani:
Irgendwann bricht dir diese Konstellation das Genick.
Spätestens, wenn alle 3 Felder mal gleich sind face-wink
Deshalb finde ich die Verwendung von ID auch rech ... "krumm", da das ja scheinbar kein Primary Key ist.

@normalisierung:
Ausnahmen bestätigen die Regel. face-wink Mal sehen wie lange. face-big-smile

VW
Mitglied: 64246
64246 12.09.2008 um 15:44:36 Uhr
Goto Top
Richtig, id ist kein Primary Key. Ausgangslage ist, dass jede id beliebig viele Eigenschaften sammeln kann und soll. Sprich es handelt sich hierbei um ein offenes Datenmodell bei dem zu keinem Zeitpunkt bekannt ist, welche weiteren Werte gespeichert werden. Somit ist eine sequenzielle Datenhaltung inerhalb einer Zeile ausgeschlossen.

Wenn Ihr das Modell für ungünstig erachtet, dann bin ich für Vorschläge offen.
Mitglied: it-frosch
it-frosch 12.09.2008 um 18:34:26 Uhr
Goto Top
Hallo serverpirat,

ich kenne die Bibel für DB nicht auswendig aber es sollte schon reichen wenn du eine automatisch vergebene eindeutige ID für jeden in deine Tabelle mit einbaust.
Damit hättest du zuerst einmal ausgeschlossen das irgendwann zwei identische Datensätze entstehen können.

Ansonsten scheint das Script ja geholfen zu haben. face-wink
Mitglied: 36831
36831 12.09.2008, aktualisiert am 18.10.2012 um 18:36:14 Uhr
Goto Top
Moin,

die automatische ID dann aber bitte auch zum Primary Key machen, um dopplungen zu vermeiden, wenn jemand in den Datensätzen rummanipuliert.

Ich würde allerdings mit verschiedenen Tabellen, wie ich es hier schonmal dargestellt habe, arbeiten. Das ist allerdings auch nur ein schneller Entwurf, der noch keine Keys usw. beinhaltet.

VW
Mitglied: Biber
Biber 12.09.2008 um 19:22:06 Uhr
Goto Top
@it-frosch

aber es sollte schon reichen wenn du eine automatisch vergebene eindeutige ID für jeden in deine Tabelle mit einbaust.
Jein... damit hätte er ein formales Ziel (Eindeutigkeit und Identifizierbarkeit eines Datensatzes) zwar erreicht, nicht aber sein (fachliches) Ziel - doppelte Dateninhalte auszuschließen.
Wem nützen denn zwei Sätze mit [1234-broker-221] und [1234-broker-110], auch wenn davor noch eine generierte unterschiedliche Auto-Id steht?

Der PK sollte die Kombination aus (jetzt vorhandener) ID und Element sein.
jede dieser Kombinationen kann an einem zeitpunkt ja nur ein Value haben.

Und sinnvoll wäre es, wenn die ID-Daten (1234, 1235...) noch in einer ID-Stammdatentabelle wären genau wie auch die Element-Enumeration.

Mit einer Struktur
- ID (FK mit Referenz auf "ID-Stammtabelle")
- Element (FK mit Referenz auf Elementstammdatentabelle)
- Wert
und einem PK aus ID, Element sollte es sinnvoller sein.
Und ein zusätzliches Feld muss auch nicht angelegt werden.

Grüße
Biber
Mitglied: 64246
64246 13.09.2008 um 12:43:22 Uhr
Goto Top
@it-frosch

Vielen Dank für das Statement. Funktioniert wunschgemäß
Mitglied: it-frosch
it-frosch 13.09.2008 um 13:55:54 Uhr
Goto Top
@Biber

du hast es gründlich gemacht. Ich war zugegebenermaßen zu faul dazu. face-wink

Allerdings habe ich Serverpirat so verstanden das eine "ID" schon mehrfach das Element "broker" mit unterschiedlichen "Values" haben könnte.

Ein schönes WE noch
IT-Frosch
Mitglied: 64246
64246 13.09.2008 um 14:02:03 Uhr
Goto Top
id ist unique und auch ein primär schlüssel, allerdings nicht in dieser tabelle.

vielen dank für eure mühen das datenmodell zu verfeinern. allerdings ist das vergebene arbeit, da ihr nur einen winzigen teil des datenmodells kennt und somit nur fehler machen könnt. aber das ziel ist erreicht. die abfrage von it-frosch funktioniert und ich hab was dazu gelernt.

ich danke allen für ihre beiträge.

beste grüße

serverpirat