Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MySQL - Zwei Abfragen in einer?

Frage Entwicklung Datenbanken

Mitglied: 64246

64246 (Level 1)

11.09.2008, aktualisiert 18.10.2012, 5564 Aufrufe, 19 Kommentare

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
Mitglied: VW
11.09.2008 um 19:18 Uhr
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?
Bitte warten ..
Mitglied: 64246
11.09.2008 um 19:39 Uhr
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'
Bitte warten ..
Mitglied: VW
11.09.2008 um 19:58 Uhr
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?

Mit freundlichen Grüßen,
VW
Bitte warten ..
Mitglied: Dani
12.09.2008 um 01:08 Uhr
@VW
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
Bitte warten ..
Mitglied: VW
12.09.2008 um 08:05 Uhr
@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.

VW
Bitte warten ..
Mitglied: 64246
12.09.2008 um 08:29 Uhr
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
Bitte warten ..
Mitglied: Dani
12.09.2008 um 10:43 Uhr
@VW
Ok...war doch schon etwas später bei mir....

@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.


Grüsse,
Dani
Bitte warten ..
Mitglied: it-frosch
12.09.2008 um 10:53 Uhr
Hallo,

ich habe das unter Firebird SQL getestet !

So sieht die Lösung für dein Problem aus:
01.
select * from tabelle b where b.id in  
02.
(select a.id from tabelle a where element='broker' and value=221)  
03.
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) !
01.
CREATE TABLE t_test 
02.
03.
  id integer default NULL, 
04.
  element Varchar(10) DEFAULT NULL COLLATE PXW_INTL850, 
05.
  wert integer default Null 
06.
);
dann die Tabelle mit Werten befüllt:
01.
insert into t_test (id,element,wert) values (1234,'broker',221); 
02.
insert into t_test (id,element,wert) values (1234,'appStatus',33); 
03.
insert into t_test (id,element,wert) values (1235,'broker',221); 
04.
insert into t_test (id,element,wert) values (1235,'test',221); 
05.
insert into t_test (id,element,wert) values (1236,'broker',221); 
06.
insert into t_test (id,element,wert) values (1236,'appStatus',11); 
07.
insert into t_test (id,element,wert) values (1236,'broker',221);
und dann mit dem Script ausgelesen.

Bei Fragen noch mal melden.
Bitte warten ..
Mitglied: it-frosch
12.09.2008 um 11:18 Uhr
Hallo Dani,

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

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.
Bitte warten ..
Mitglied: VW
12.09.2008 um 13:49 Uhr
Moin,

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

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
Bitte warten ..
Mitglied: Dani
12.09.2008 um 14:22 Uhr
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
Bitte warten ..
Mitglied: VW
12.09.2008 um 15:27 Uhr
Zitat von Dani:
Irgendwann bricht dir diese Konstellation das Genick.
Spätestens, wenn alle 3 Felder mal gleich sind
Deshalb finde ich die Verwendung von ID auch rech ... "krumm", da das ja scheinbar kein Primary Key ist.

@Normalisierung:
Ausnahmen bestätigen die Regel. Mal sehen wie lange.

VW
Bitte warten ..
Mitglied: 64246
12.09.2008 um 15:44 Uhr
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.
Bitte warten ..
Mitglied: it-frosch
12.09.2008 um 18:34 Uhr
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.
Bitte warten ..
Mitglied: VW
12.09.2008, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: Biber
12.09.2008 um 19:22 Uhr
@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
Bitte warten ..
Mitglied: 64246
13.09.2008 um 12:43 Uhr
@it-frosch

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

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

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
Bitte warten ..
Mitglied: 64246
13.09.2008 um 14:02 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

Webbrowser
gelöst Daten in entfernte Mysql DB schreiben (3)

Frage von nullacht15 zum Thema Webbrowser ...

Windows 7
Computer OU auslesen bzw. abfragen (2)

Frage von mexx991 zum Thema Windows 7 ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...