MySQL
juper
- datenbank
0 Vinzenz Mai0 juper
Hi there
Ich habe folgendes Problem, und zwar habe ich eine Tabelle, mit angenommen 3 spalten
ID WERT1 WERT2
1 1 2
2 0 1
Nun möchte ich, falls der wert höher als 0 ist, für jeden wert die zeile einzeln selektieren, sprich das ergebnis sollte folgendermassen ausschauen
ID WERT1
1 1
ID WERT2
1 2
2 1
Ich habe zwar im MySQL manual die IF Bedingung gefunden, kann allerdings nicht wirklich etwas damit anfangen
vielen dank für die hilfe
Hallo
ID WERT1 WERT2
1 1 2
2 0 1
Nun möchte ich, falls der wert höher als 0 ist, für jeden wert die zeile einzeln selektieren, sprich das ergebnis sollte folgendermassen ausschauen
Ich habe leider nicht ganz verstanden, was Du willst. Du zeigst uns hier zwei Ergebnismengen:
ID WERT1
1 1
Dieses Ergebnis erhältst Du mit
SELECT
ID,
WERT1
FROM tabellenname
WHERE WERT1 > 0
Die zweite Ergebnismenge analog mit
ID WERT2
1 2
2 1
SELECT
ID,
WERT2
FROM tabellenname
WHERE WERT2 > 0
Wenn Du etwas anderes suchst, müsstest Du dies genauer erklären.
Freundliche Grüße
Vinzenz
Hallo
ID WERT1 WERT2
1 1 2
2 0 1Nun möchte ich, falls der wert höher als 0 ist, für jeden wert die zeile einzeln selektieren, sprich das ergebnis sollte folgendermassen ausschauen
Ich habe leider nicht ganz verstanden, was Du willst. Du zeigst uns hier zwei Ergebnismengen:
ID WERT1
1 1Dieses Ergebnis erhältst Du mit
SELECT
ID,
WERT1
FROM tabellenname
WHERE WERT1 > 0
>
> Die zweite Ergebnismenge analog mit
>
> > ID WERT2
> > 1 2
> > 2 1
>
> ~~~sql
SELECT
> ID,
> WERT2
> FROM tabellenname
> WHERE WERT2 > 0
Wenn Du etwas anderes suchst, müsstest Du dies genauer erklären.
Freundliche Grüße
Vinzenz
Hi Vinzenz, die Ergebnisse sind Richtig, allerdings möchte ich alle in einem SELECT erhalten. Sprich das ich mit evtll mit einer IF oder CASE Bedingung zuerst alle Wert1 abfrage und sie ausgebe, und in einem 2ten schritt alle Wert2.
Ich frage mich allerdings gerade, ob das überhaupt möglich ist
Hallo
sei doch bitte so nett und unterlasse in Zukunft "Fullquotes". Die meisten Mitleser (und das Archiv) werden es Dir danken.
ID WERT1
1 1
ID WERT2
1 2
2 1
Hi Vinzenz, die Ergebnisse sind Richtig, allerdings möchte ich alle in einem SELECT erhalten.
Wie stellst Du Dir dies vor. Deine zwei Ergebnismengen haben unterschiedliche Spaltenüberschriften. Einmal heißt die zweite Spalte WERT1, einmal WERT2. Eine Spalte kann aber nur eine Überschrift haben.
Spielt die Überschrift jedoch keine Rolle, d.h. wenn Dein Ergebnis
ID WERT
1 1
1 2
1 1
lauten darf, dann kannst Du dies mit einem Statement erreichen. Falls Deine MySQL-Version >= 4.0.0 ist, wäre UNION eine Möglichkeit.
Freundliche Grüße
Vinzenz
sei doch bitte so nett und unterlasse in Zukunft "Fullquotes". Die meisten Mitleser (und das Archiv) werden es Dir danken.
ai
sorry, macht der gewohnheit *rot werd*
Wie stellst Du Dir dies vor. Deine zwei Ergebnismengen haben unterschiedliche Spaltenüberschriften. Einmal heißt die zweite Spalte WERT1, einmal WERT2. Eine Spalte kann aber nur eine Überschrift haben.
Jep ist mir eben auch in den Sinn gekommen, geht nicht :-/
Leider spielt der Spaltennname eine rolle
Ich hätte noch eine weitere frage, und zwar habe ich zwei tabellen
user
-------------
ID
1
sowie
Freund
------------
ID User_ID
1 1
2 1
3 1
angenommen ein user hat unendlich viele freunde, ich muss allerdings einen select machen, welcher folgendes ergebnis zurückgibt
user.ID Freund1.ID freund2.ID
Wie muss ich das selektieren, dass einfach die ID's der jeweils ersten beiden Freunde der Tabelle ins select-Resultset genommen werden (Falls keiner oder nur ein Freund vorhanen, einfach nichts reinschreiben, also 0 oder null)
Hi,
Wie stellst Du Dir dies vor. Deine zwei Ergebnismengen haben unterschiedliche Spaltenüberschriften. Einmal heißt die zweite Spalte WERT1, einmal WERT2. Eine Spalte kann aber nur eine Überschrift haben.
Jep ist mir eben auch in den Sinn gekommen, geht nicht :-/
Leider spielt der Spaltennname eine rolle
Das ist nicht der Untergang...
Du könntest in deinem UNION+SELECT eine blinde Spalte verwenden:
SELECT
ID,
WERT1 AS WERT1,
null AS WERT2
FROM tabellenname
WHERE WERT1 > 0
UNION
SELECT
ID,
null AS WERT1,
WERT2 AS WERT2
FROM tabellenname
WHERE WERT2 > 0
Wie muss ich das selektieren, dass einfach die ID's der jeweils ersten beiden Freunde der Tabelle ins select-Resultset genommen werden (Falls keiner oder nur ein Freund vorhanen, einfach nichts reinschreiben, also 0 oder null)
Also als erstes die Anmerkung: Das geht NICHT dynamisch, du musst im Voraus wissen wie viele Freunde du suchst. Und dann direkt die Gegenfrage: Was sind die ersten beiden Freunde, die ersten beiden gefundenen, irgendwelche beiden, oder woran kann man die identifizieren?
MfG
Rouven
Du könntest in deinem UNION+SELECT eine blinde Spalte verwenden:
SELECT
ID,
WERT1 AS WERT1,
null AS WERT2
FROM tabellenname
WHERE WERT1 > 0
UNION
SELECT
ID,
null AS WERT1,
WERT2 AS WERT2
FROM tabellenname
WHERE WERT2 > 0
Was passiert da genau? Wie Sieht da der Spaltenname aus? Sind das nicht 2 Recordsets?
Also als erstes die Anmerkung: Das geht NICHT dynamisch, du musst im Voraus wissen wie viele Freunde du suchst. Und dann direkt die Gegenfrage: Was sind die ersten beiden Freunde, die ersten beiden gefundenen, irgendwelche beiden, oder woran kann man die identifizieren?
Also ich weiss ja nicht, wie viele Freunde der jeweilige user hat. Im select sollen einfach Maximal 2 selektiert werden können. Die beiden ersten kann man einfach anhand der position in der datenbank identifizieren - einfach gesagt, wer zuerst kommt, mahlt zuerst
die z ersten gefundenen werden ausgelesen
Könnte man das nicht irgendwie mit Variablen(zbsp einem Array) lösen?
Sprich dass ich während dem select ein select mache und das Array fülle, und dann die werde aus dem array ins recordset tue?
Hi,
Was passiert da genau? Wie Sieht da der Spaltenname aus? Sind das nicht 2 Recordsets?
Nene, da kommt ein Recordset raus mit einer beliebigen Anzahl von Ergebnissen. Für die Spaltennamen ist das "AS" zuständig, das benötige ich auch um die Pseudo-Spalte in den beiden Abfragen überhaupt mit einem Namen zu versehen. Eine Hälfte der Datensätze hat in der einen Spalte nichts stehen, die andere in der anderen.
Könnte man das nicht irgendwie mit Variablen(zbsp einem Array) lösen?
Sprich dass ich während dem select ein select mache und das Array fülle, und dann die werde aus dem array ins recordset tue?
Die Frage ist: Brauchst du _wirklich_ alles in einer Abfrage als Spalten? Mit Zeilen oder verschiedenen Abfragen ist das wirklich einfacher...
Ansonsten wäre mein spontaner Gedanke ein zweifacher Self-JOIN (also eigentlich ein "Anzahl auszugebender Freunde"-Selfjoin.
SELECT ursprung.user_id,
ursprung.id AS Freund_1
fuer_freund_2.id AS Freund_2
FROM Freund AS ursprung LEFT JOIN Freund AS fuer_freund_2
ON fuer_freund_2.userid = ursprung.userid
Falls dir das ganze JOIN-Thema nichts sagt, hab ich hier zwei Artikel für dich:
Einführung
Mehrfachjoin
MfG
Rouven
Hallo,
SELECT ursprung.user_id,
ursprung.id AS Freund_1
fuer_freund_2.id AS Freund_2
FROM Freund AS ursprung LEFT JOIN Freund AS fuer_freund_2
ON fuer_freund_2.userid = ursprung.userid
Wobei man dann aber sicherstellen sollte, dass nicht zweimal der gleiche Freund abgefragt wird, da ich vermute, dass die Datenbank für beide Joins die gleiche Sortierung verwendet (egal ob man sie angegeben hat oder nicht).
Grüße
Klaus
Hi,
damn, als ich das Statement geschrieben hatte wusste ich, da fehlt noch was...
...
WHERE fuer_freund_2.id <> ursprung.id
OR fuer_freund_2.id IS NULL
Warum zwei Bedingungen? Wenn es nur einen Freund gibt, dann dürfte
"NULL <> 123" zu NULL und damit nicht für das Ergebnis relevant sein...
MfG
Rouven
SELECT ursprung.user_id,
ursprung.id AS Freund_1
fuer_freund_2.id AS Freund_2
FROM Freund AS ursprung LEFT JOIN Freund AS fuer_freund_2
ON fuer_freund_2.userid = ursprung.userid
Könntet ihr das mal mit den Tabellennamen USer und Freund machen?
was ist ursprung? Ich seh die Usertabelle nirgends...
Hi,
ähm, also ich erklär's dir gerne, aber vielleicht solltest du dich noch etwas mehr mit den Grundstrukturen von SQL vertraut machen.
MySQL+SELECT
Man kann sowohl Spalten als auch Tabellen mit einem Alias versehen. In der Regel macht man das um (1) lange Namen, die man mehrfach schreiben muss, durch kurze zu ersetzen oder (2) um bei mehrfacher Verwendung ein und der selben Tabelle (siehe Self-JOIN) anzugeben _welche_ der beiden man meint.
Einen solchen ALIAS vergibt man in der langversion mittels Schlüsselwort AS
z.B. SELECT spalte1 AS anderer_name_fuer_spalte_1
oder SELECT spalte1 FROM tabelle1 AS anderer_name_fuer_tabelle_1
Da den Standardisierern aufgegangen ist, dass diese Schreibweise eigentlich zu umständlich ist, kann man das AS auch einfach weglassen.
Genau sowas habe ich in deiner Abfrage gemacht: Ich habe also einmal auf die Tabelle Freunde zugegriffen und sie mit "ursprung" benannt und ein weiteres Mal, wo ich sie "fuer_freund_2" genannt habe. In dem Fall ist die Umbenennung nötig gewesen, denn wenn ich Freund.ID schreib, welche der beiden meine ich dann?
MfG
Rouven