mal wieder join ;-(
Twilo
- datenbank
Hallo,
ich komme hier nicht weiter *grml*
ich habe 3 Tabellen
+-----------------+-----------------+-------------+
| Tabelle1 | Tabelle2 | Kommentare |
+-----------------+-----------------+-------------+
| _id | _id | _id |
+-----------------+-----------------+-------------+
| _geloescht | _geloescht | _setcard_id |
+-----------------+-----------------+-------------+
| _freigeschaltet | _freigeschaltet | _art |
+-----------------+-----------------+-------------+
| ... | ... | ... |
+-----------------+-----------------+-------------+
_setcard_id hat entweder die ID von Tabelle1 oder Tabelle2
ich möchte 10 Datensätze aus Kommentare abrufen
Bedingung
die _setcard_id dard nicht gesperrt sein
der Kommentar muss freigeschaltet sein
ich probiere hier bestimmt schon einige Stunden, komme aber zu keinen Erfolg
hier mein letzter Ansatz
SELECT kommentare._setcard_id, kommentare._art, kommentare._name
FROM kommentare, tabelle1, tabelle2
WHERE (
tabelle1._id = kommentare._setcard_id
OR tabelle2._id = kommentare._setcard_id
)
AND kommentare._freigeschaltet = "1"
AND kommentare._geloescht = "0"
AND (
tabelle1._geloescht = "0"
OR tabelle2._geloescht = "0"
)
ORDER BY kommentare._id DESC
LIMIT 0 , 10
ich danke schon mal für eure Hilfe
mfg
Twilo
Hallo Twilo,
select a._setcard_id
,a._art
,a._name
from kommentare a
,tabelle1 b
,tabelle2 c
where a._setcard_id=b._id
and a._setcard_id=c._id
and a._freigeschaltet=1
and a._geloescht=0
and (
b._geloescht=0
or c._geloescht=0
)
order by a._id
;
ich danke schon mal für eure Hilfe
warten wir's ab :-)
Viele Grüße,
coolblue
Hallo,
select a._setcard_id
,a._art
,a._name
from kommentare a
,tabelle1 b
,tabelle2 c
where a._setcard_id=b._id
and a._setcard_id=c._id
and a._freigeschaltet=1
and a._geloescht=0
and (
b._geloescht=0
or c._geloescht=0
)
order by a._id
LIMIT 0,10 ;
ich hab das jetzt so eingegeben,
aber ich bekomme kein Ergebnis :-(
where a._setcard_id=b._id
and a._setcard_id=c._id
das kann glaube ich auch nicht ganz stimmen
da a._setcard_id entweder zu b._id oder zu c._id gehören kann
ich hatte da schon mal ein OR gesetzt, aber dann hatte ich sowas rausbekommen
+-------------+----------+-----------+
| _setcard_id | _art | _name |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
| 1 | ereignis | Klaus bla |
+-------------+----------+-----------+
mfg
Twilo
Hallo,
where a._setcard_id=b._id
and a._setcard_id=c._id
welche Software nutzt du? MySQL?
Ich wollte mit diesen Bedingungen zunächst einmal die Tabellen verknüpfen und das hat zunächst nichts mit den Werten zu tun, die du am Ende herausbekommen möchtest.
Aus deiner ersten Nachricht konnte ich nicht herausfiltern, nach welchen Bedingungen nun etwas selectieren wolltest.
Bitte versuche es nochmal zu schildern.
Grundlegendes:
Tabelle1
-------------------------------------------------
| Tab1-Spalte1 | Tab1-Spalte2 | Tab1-Spalte3 |
-------------------------------------------------
| Wert1-Spalte1 | Wert1-Spalte2 | Wert1-Spalte3 |
-------------------------------------------------
| Wert2-Spalte1 | Wert2-Spalte2 | Wert2-Spalte3 |
-------------------------------------------------
Tabelle2
-------------------------------------------------
| Tab2-Spalte1 | Tab2-Spalte2 | Tab2-Spalte3 |
-------------------------------------------------
| Wert1-Spalte1 | Wert1-Spalte2 | Wert1-Spalte3 |
-------------------------------------------------
| Wert2-Spalte1 | Wert2-Spalte2 | Wert2-Spalte3 |
-------------------------------------------------
Kommentare
-------------------------------------------------
| Komm-Spalte1 | Komm-Spalte2 | Komm-Spalte3 |
-------------------------------------------------
| Wert1-Spalte1 | Wert1-Spalte2 | Wert1-Spalte3 |
-------------------------------------------------
| Wert2-Spalte1 | Wert2-Spalte2 | Wert2-Spalte3 |
-------------------------------------------------
Verknüpfung der Tabellen über eine Spalte, hier Spalte1 jeder
Tabelle. Deine primäre Tabelle soll Kommentare sein.
where komm.spalte1=tab1.spalte1
and komm.spalte1=tab2.spalte1
Jetzt willst du nur bestimmte Werte haben, und zwar (Beispiel!!!) alle Werte, die aus Tabelle1-Spalte2 auf 0 stehen und in Tabelle2-Spalte3 auf 1.
and tab1.spalte2=0
and tab2.spalte3=1
Wenn mich nicht alles täuscht, dann müsste die Bedingung
and (
tab1.spalte2=0
or tab2.spalte3=1
)
genau das gleiche ausgeben, habe es aber nicht getestet und kann es somit nicht mit Sicherheit behaupten!
Viele Grüße,
coolblue
Hallo,
also
+-----------------+-----------------+-------------+
| Tabelle1 | Tabelle2 | Kommentare |
+-----------------+-----------------+-------------+
| _id | _id | _id |
+-----------------+-----------------+-------------+
| _geloescht | _geloescht | _setcard_id |
+-----------------+-----------------+-------------+
| _freigeschaltet | _freigeschaltet | _art |
+-----------------+-----------------+-------------+
| ... | ... | ... |
+-----------------+-----------------+-------------+
Tabelle1 (ereignis)
+-----------------+-----------------+-----------------+-----
| _id | _geloescht | _freigeschaltet | ...
+-----------------+-----------------+-----------------+-----
| 1 | 0 | 1 | ...
+-----------------+-----------------+-----------------+-----
| 2 | 1 | 1 | ...
+-----------------+-----------------+-----------------+-----
| 3 | 0 | 0 | ...
+-----------------+-----------------+-----------------+-----
Tabelle2 (anzeige)
+-----------------+-----------------+-----------------+-----
| _id | _geloescht | _freigeschaltet | ...
+-----------------+-----------------+-----------------+-----
| 1 | 1 | 1 | ...
+-----------------+-----------------+-----------------+-----
| 2 | 1 | 1 | ...
+-----------------+-----------------+-----------------+-----
| 3 | 0 | 0 | ...
+-----------------+-----------------+-----------------+-----
Kommentare
+-----------------+-----------------+-----------------+-----
| _id | _setcard_id | _art | ...
+-----------------+-----------------+-----------------+-----
| 1 | 1 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 2 | 2 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 3 | 1 | anzeige | ...
+-----------------+-----------------+-----------------+-----
| 4 | 3 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 5 | 2 | anzeige | ...
+-----------------+-----------------+-----------------+-----
jetzt sollte nur Kommentar 1 ausgegeben werden
Bedingung
ein Kommentar soll nur ausgegeben werden, wenn das Ereignis/Anzeige Freigeschaltet und nicht gelöscht ist
ps. Tabelle1 und Tabelle2 sehen so zwar gleich aus, aber die restlichen Felder sind total verschieden, deshalb hab ich mich entschieden, 2 Tabellen dafür zu nehmen
oder ist es einfacher, wenn ich für die Kommentare auch 2 verschiedene Tabellen nehme?
ich bräuchte dann aber das Ergebnis wider zusammengewürfelt :)
genutzer wird MySQL 4.0.22
mich würde auch interessieren, wie ich das mit MDB_QueryTool hinbekommen würde
ich hoffe, dass diese Erklärung jetzt etwas besser ist, falls noch Fragen bestehen, versuche ich die so gut wie möglich zu beantworten
mfg
Twilo
Kommentare
+-----------------+-----------------+-----------------+-----
| _id | _setcard_id | _art | ...
+-----------------+-----------------+-----------------+-----
| 1 | 1 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 2 | 2 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 3 | 1 | anzeige | ...
+-----------------+-----------------+-----------------+-----
| 4 | 3 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 5 | 2 | anzeige | ...
+-----------------+-----------------+-----------------+-----jetzt sollte nur Kommentar 1 ausgegeben werden
Kommentar 1?
meinst du _id=1 oder _setcard_id=1 ?
Bedingung
ein Kommentar soll nur ausgegeben werden, wenn das Ereignis/Anzeige Freigeschaltet und nicht gelöscht ist
welchen Status hat bei dir freigeschaltet und gelöscht?
ps. Tabelle1 und Tabelle2 sehen so zwar gleich aus, aber die restlichen Felder sind total verschieden, deshalb hab ich mich entschieden, 2 Tabellen dafür zu nehmen
»»
tut zunächst nichts zur Sache! du wirst dir schon deine Gedanken gemacht haben!
oder ist es einfacher, wenn ich für die Kommentare auch 2 verschiedene Tabellen nehme?
ich bräuchte dann aber das Ergebnis wider zusammengewürfelt :)
»»
ich kenne den Hintergrund deines Vorhabens nicht! du selbst musst einplanen, wie groß dieses "Projekt" wird und entscheiden, welche Aufteilung auf Dauer die Beste ist.
genutzer wird MySQL 4.0.22
war reine Neugiert :-)
mich würde auch interessieren, wie ich das mit MDB_QueryTool hinbekommen würde
ist das ein Tool um sich SQL-Statement im Baukastenprinzip zusammen zu setzen? wenn ja, halte ich davon relativ wenig... es geht nichts über Freehand-SQL !
ich hoffe, dass diese Erklärung jetzt etwas besser ist, falls noch Fragen bestehen, versuche ich die so gut wie möglich zu beantworten
ein paar Fragen sind ja noch offen... bis dann!
Viele Grüße,
coolblue
Hallo,
Kommentare
+-----------------+-----------------+-----------------+-----
| _id | _setcard_id | _art | ...
+-----------------+-----------------+-----------------+-----
| 1 | 1 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 2 | 2 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 3 | 1 | anzeige | ...
+-----------------+-----------------+-----------------+-----
| 4 | 3 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 5 | 2 | anzeige | ...
+-----------------+-----------------+-----------------+-----jetzt sollte nur Kommentar 1 ausgegeben werden
Kommentar 1?
meinst du _id=1 oder _setcard_id=1 ?
_id = 1
da bei den anderen (ereignissen/anzeigen) die Kreterien nicht passen (freigeschaltet/gelöscht)
Bedingung
ein Kommentar soll nur ausgegeben werden, wenn das Ereignis/Anzeige Freigeschaltet und nicht gelöscht ist
welchen Status hat bei dir freigeschaltet und gelöscht?
Freigeschaltet = 1
Gelöscht = 1
nicht Freigeschaltet = 0
nicht gelöscht = 0
ps. Tabelle1 und Tabelle2 sehen so zwar gleich aus, aber die restlichen Felder sind total verschieden, deshalb hab ich mich entschieden, 2 Tabellen dafür zu nehmen
tut zunächst nichts zur Sache! du wirst dir schon deine Gedanken gemacht haben!
ich wollte das schon mal vorweg sagen, nicht das nachher jemand sagt, pack doch beides in einer Tabelle, da es identisch aussieht :)
oder ist es einfacher, wenn ich für die Kommentare auch 2 verschiedene Tabellen nehme?
ich bräuchte dann aber das Ergebnis wider zusammengewürfelt :)
ich kenne den Hintergrund deines Vorhabens nicht! du selbst musst einplanen, wie groß dieses "Projekt" wird und entscheiden, welche Aufteilung auf Dauer die Beste ist.
ich möchte auf der Startseite die letzten 10 Kommentare ausgeben lassen
es ist egal, ob sie von den Ereignissen oder von den Anzeigen kommen,
es sollen halt die letzten 10 ausgegeben werden
genutzer wird MySQL 4.0.22
war reine Neugiert :-)
ok, ich dachte, das hat jetzt etwas damit zu tun :)
mich würde auch interessieren, wie ich das mit MDB_QueryTool hinbekommen würde
ist das ein Tool um sich SQL-Statement im Baukastenprinzip zusammen zu setzen?
ja
wenn ja, halte ich davon relativ wenig... es geht nichts über Freehand-SQL !
ich finde, dass man das aber besser lesen kann,a sl wenn ich da ne ellenlange SQL-Anweisung sehe :)
ich hoffe, dass diese Erklärung jetzt etwas besser ist, falls noch Fragen bestehen, versuche ich die so gut wie möglich zu beantworten
ein paar Fragen sind ja noch offen... bis dann!
die wurden ja jetzt hoffentlich geklärt :)
schon mal danke für deien Mühe
mfg
Twilo
Kommentare
+-----------------+-----------------+-----------------+-----
| _id | _setcard_id | _art | ...
+-----------------+-----------------+-----------------+-----
| 1 | 1 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 2 | 2 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 3 | 1 | anzeige | ...
+-----------------+-----------------+-----------------+-----
| 4 | 3 | ereignis | ...
+-----------------+-----------------+-----------------+-----
| 5 | 2 | anzeige | ...
+-----------------+-----------------+-----------------+-----
ok let's go
Bedingung
ein Kommentar soll nur ausgegeben werden, wenn das Ereignis/Anzeige Freigeschaltet und nicht gelöscht istFreigeschaltet = 1
nicht gelöscht = 0
und kommentare._id=1
zuerst habe ich mir gedacht, warum ein kommentar anzeigen, wenn es in einer der beiden tabellen (tabelle1 oder tabelle2) als nicht freigeschaltet oder gelöscht makiert ist, ausgeben lassen... eigentlich müssten beide bedingungen immer zutreffen:
select a.id
,a.setcard_id
,a.ereignis
from kommentare a
,tabelle1 b
,tabelle2 c
where a.id=b.id
and a.id=c.id
and a.id=1
and b.geloescht=0
and b.freigeschaltet=1
and c.geloescht=0
and c.freigeschaltet=1
;
aber da du der master of destaster bist und über dein projekt den besseren überblick hast, geht es auch mit "oder":
select distinct a.id
,a.setcard_id
,a.ereignis
from kommentare a
,tabelle1 b
,tabelle2 c
where a.id=b.id
and a.id=c.id
and a.id=1
and (
b.geloescht=0
and b.freigeschaltet=1
or (
c.geloescht=0
and c.freigeschaltet=1
)
)
;
der grund, weshalb da ein distinct drin ist, ist recht einfach. dadurch, dass freigeschaltet und nicht gelöscht entweder in tabelle1 oder tabelle2 true zurückgeben kann, kann das kommentar auch für jeden true rückgabewert ausgegeben werden, das heißt einmal für tabelle1 und tabelle2. distinct reduziert doppelte ausgaben auf 1.
das nächste select statement scheint auf den ersten anhieb ebenfalls korrekt, aber bei genauer betrachtung der where klausel erkennt man schnell, dass durch die or bedingung die bedingung a.id=1 aufgehoben wird, sobald die or bedingung den wert true zurück gibt.
select distinct a.id
,a.setcard_id
,a.ereignis
from kommentare a
,tabelle1 b
,tabelle2 c
where a.id=b.id
and a.id=c.id
and a.id=1
and (
b.geloescht=0
and b.freigeschaltet=1
)
or (
c.geloescht=0
and c.freigeschaltet=1
)
;
also wäre das falsch.
ich habe mir auf die schnelle die drei tabellen gebastlet (oracle 9.2.0.5) und die select statements getestet, deshalb fehlen auch die führenden unterstriche (_id)... alle statements sind zwar syntaktisch richtig, allerdings ist für dich - wenn ich dich richtig verstanden habe - nur das 2. resultat von belangen!
wenn ja, halte ich davon relativ wenig... es geht nichts über Freehand-SQL !
ich finde, dass man das aber besser lesen kann,a sl wenn ich da ne ellenlange SQL-Anweisung sehe :)
es gibt menschen, die leben in der windows regedit oder können megabytes hexdumps lesen... alles eine sache der übung :-)
zu denen gehöre ich allerdings nicht, aber ein paar hundert zeilen code wären kein problem!
schon mal danke für deien Mühe
no problem, hab ja sonst nix zu tun :-)
falls es trotzdem noch nicht funzt, dann scheinst du wohl ein anderes problem zu haben.
sollte das 2. statement noch immer nichts ausgeben, dann kann es auch einfach daran liegen, dass es keine kommentare gibt, die freigeschaltet=1 und gelöscht=0 sind.
Viele Grüße,
coolblue
Hallo,
dieses Select gibt mir jetzt die Kommentare aus, die ich auch erwarte :-)
es hat nur das _distinct_ gefehlt :-(
bei dein 2. Select bekam ich _kein_ Ergebnis
where a.id=b.id
sieht für mich auch etwas falsch aus, da die ID mit den Kommentaren stimmen muss :-)
aber danke nochmal =)
der Ansatz von mir war ja richtig, nur an der Ausführung hat es gehappert :)
mfg
Twilo
Hallo,
funktioniert doch nicht so, wie es soll ;-(
DROP TABLE IF EXISTS kommentare
;
CREATE TABLE IF NOT EXISTS kommentare
(
\_id
int(11) unsigned NOT NULL auto_increment,
\_setcard\_id
int(11) NOT NULL default '0',
\_art
varchar(255) NOT NULL default '',
PRIMARY KEY (\_id
)
) TYPE=MyISAM AUTO_INCREMENT=9 ;
INSERT INTO kommentare
VALUES (1, 1, 'anzeige');
INSERT INTO kommentare
VALUES (2, 2, 'anzeige');
INSERT INTO kommentare
VALUES (3, 1, 'ereignis');
INSERT INTO kommentare
VALUES (4, 3, 'anzeige');
INSERT INTO kommentare
VALUES (5, 2, 'ereignis');
INSERT INTO kommentare
VALUES (6, 4, 'anzeige');
INSERT INTO kommentare
VALUES (7, 3, 'ereignis');
INSERT INTO kommentare
VALUES (8, 3, 'ereignis');
DROP TABLE IF EXISTS tabelle1
;
CREATE TABLE IF NOT EXISTS tabelle1
(
\_id
int(11) unsigned NOT NULL auto_increment,
\_freigeschaltet
enum('0','1') NOT NULL default '0',
\_geloescht
enum('0','1') NOT NULL default '0',
PRIMARY KEY (\_id
)
) TYPE=MyISAM COMMENT='anzeige' AUTO_INCREMENT=5 ;
INSERT INTO tabelle1
VALUES (1, '', '');
INSERT INTO tabelle1
VALUES (2, '1', '');
INSERT INTO tabelle1
VALUES (3, '', '1');
INSERT INTO tabelle1
VALUES (4, '1', '1');
DROP TABLE IF EXISTS tabelle2
;
CREATE TABLE IF NOT EXISTS tabelle2
(
\_id
int(11) unsigned NOT NULL auto_increment,
\_freigeschaltet
enum('0','1') NOT NULL default '0',
\_geloescht
enum('0','1') NOT NULL default '0',
PRIMARY KEY (\_id
)
) TYPE=MyISAM COMMENT='ereignis' AUTO_INCREMENT=5 ;
INSERT INTO tabelle2
VALUES (1, '1', '1');
INSERT INTO tabelle2
VALUES (2, '', '1');
INSERT INTO tabelle2
VALUES (3, '1', '');
INSERT INTO tabelle2
VALUES (4, '', '');
jetzt sollen Kommentare 2, 7 und 8 ausgegeben werden
Kommentar 2 gehört zur Tabelle1 Eintrag 2
Eintrag 2 ist freigeschaltet und nicht gelöscht
Kommentar 7 und 8 gehören zur Tabelle2 Eintrag 3
Eintrag 3 ist freigeschaltet und nicht gelöscht
die anderen Kommentare dürfen nicht ausgegeben werden, da die Bedingungen nicht erfüllt sind
mfg
Twilo