mysql abfrage-prob
kleiner heiner
- datenbank
0 Andavos0 kleiner heiner0 kleiner heiner0 Andavos0 kleiner heiner0 Ilja0 kleiner heiner0 Ilja0 Ilja0 kleiner heiner
hi hi!
ich hab zu später stund' noch n kleines mysql abfrage-prob. ich hoffe da ist nochjemend mit nem tipp.
wie kann man alle id's extrahieren die den inhalt A und C haben?
id|inhalt
1|A
1|B
1|C
2|B
2|A
3|C
3|A
-> würde id 1 und 3 ergeben
mfg
heiner
Hallo,
$abfrage = "SELECT * FROM tabelle WHERE inhalt IN(A, C)";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo "$row->id";
}
MFG
Andavos
hi andavos,
vielen dank für die schnelle hilfe, das funktioniert wunderbar
heiner
nochmal das gleiche prob, aber zusätzlich soll die reihenfolge A -> C sein, nicht C -> A
id|inhalt|auto_id
1|A|1
1|B|2
1|C|3
2|B|4
2|A|5
3|C|6
3|A|7
ergibt id 1
ich hoffe ihr habt eine idee??!
heiner
Hallo,
so (a->c)
$abfrage = "SELECT * FROM tabelle WHERE inhalt IN(A, C) ORDER BY inhalt ";
bzw (c->a).
$abfrage = "SELECT * FROM tabelle WHERE inhalt IN(A, C) ORDER BY inhalt DESC";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo "$row->id";
}
MFG
Andavos
hi andavos,
ich meinte etwas anderes, ich versuche es deutlicher zu erklären: die abfrage soll nur auf inhalt A vor C matchen, d.h. wenn C vor A in der tabelle steht, match die abfrage nicht.
(wenn die auto_id von A kleiner ist als die von C dann matcht die abfrage.)
id|inhalt|auto_id
1|A|1
1|B|2
1|C|3
2|B|4
2|A|5
3|C|6
3|A|7
ergibt nur die id 1, weil bei id 3 C vor A steht.
ich hoffe die erklärung ist besser...
heiner
yo,
ich meinte etwas anderes, ich versuche es deutlicher zu erklären: die abfrage soll nur auf inhalt A vor C matchen, d.h. wenn C vor A in der tabelle steht, match die abfrage nicht.
das ist etwas unglücklich ausgedrückt. die reihenfolge wie datensätze in der tabelle stehen ist unsortiert, das heisst eine höhere id kann vor einer niedrigen stehen.
(wenn die auto_id von A kleiner ist als die von C dann matcht die abfrage.)
das ist schon deutlicher, da diese aussage sich auf die werte bezieht und nicht auf deren position in der tabelle.
id|inhalt|auto_id
1|A|1
1|B|2
1|C|3
2|B|4
2|A|5
3|C|6
3|A|7ergibt nur die id 1, weil bei id 3 C vor A steht.
ganz nachvollziehen kann ich die logik aber immer noch nicht, die du abbilden willst. wo steht den bei id 3 ein C vor dem A, kannst du noch einmal in anderen worten ausdrücken, welche datensätze ausgewählt werden sollen ?
Ilja
hi ilja
es sollen alle "ids" gefunden werden, die den "inhalt" A und C beinhalten, in der reihenfolge A -> C (bei "id" 1 ist das so), aber nicht die reihenfolge C -> A (bei "id" 3 ist das so). oder anders: wenn die auto_id von A kleiner ist als die von C dann matcht die abfrage. (es soll allerdings jede beliebige reihenfolge abgefragt werden können.)
folgende tabelle:
id|inhalt|auto_id
1|A|1
1|B|2
1|C|3
2|B|4
2|A|5
3|C|6
3|A|7
gewünschtes ergebnis: "id" 1
ich hoffe das war etwas verständlicher.
teillösung:
SELECT id FROM tabelle WHERE inhalt IN("A","C") GROUP BY id HAVING COUNT(id) >= 2
jetzt muss noch die reihenfolge A->C beachtet werden...
gruß
heiner
yo Heiner,
jetzt ist auch mir ein licht aufgegangen. das hört sich nach einem self join an, da du ja unterschiedliche datensätze der gleichen tabelle in beziehung bringen musst.
SELECT DISTINCT tab1.id
FROM tabelle AS tab1, tabelle AS tab2
WHERE tab1.id=tab2.id
AND tab1.inhalt='A' AND tab2.inhalt='C'
AND tab1.auto_id > tab2.auto_id;
nicht ausprobiert und bin mir selbst ein wenig unsicher, ob das geht. aber versuch das mal.
Ilja
yo,
abgeschickt und gleich einen fehler gemacht. mach mal in der letzten zeile lieber ein kleiner als größer, also:
AND tab1.auto_id < tab2.auto_id;
Ilja
SELECT DISTINCT tab1.id
FROM tabelle AS tab1, tabelle AS tab2
WHERE tab1.id=tab2.id
AND tab1.inhalt='A' AND tab2.inhalt='C'
AND tab1.auto_id < tab2.auto_id;
1A! funktioniert in beide richtungen (A->C oder C->A). danke ilja! ich muss mich in zukunft mehr mit self-joins (hab davon vorher nie was gehört :-) ) beschäftigen...
gruß
heiner