CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
17.11.2010, 21:49:38
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
Ausgabe trotz leere Tabellen
Hallo Forum,
ich habe ein kleines MySQL Problem wo ich momentan nicht durchblicke.
Es gibt fotos die rechtlich eingeschrenkt sind einerseits habe ich die tabelle fotos wo man sichtbar einstellen kann in dem fall sollen die fotos von jedem ausnahmslos gesehen werden.
Dann gibt es Account Rechte je nach dem ob der account die rechte hat darf er die kategorien sehen
Dann gibt es noch Klassen rechte die die einsehen können.
So klasse und Account rechte können wahlweise ein leeres ergebnis zurückliefern.
mein problem ist ist eine der beiden tabellen leer dann bekomme ich kein ergebnis... ich habe gelesen das es mit LEFT JOIN das zu lösen wäre aber komme nicht klar mit der definierung.
kann mir einer evtl. sagen was an meiner abfrage falsch ist?
mit dem ganzen hin und her probieren bin ich momentan so stehen geblieben worauf ich einen fehler bekomme.
PHP-Code:
SELECT
F.ID AS F_ID, F.lehrmaterial_einsicht_ID, F.Titel AS F_Titel,
F.Beschreibung AS F_Beschreibung, F.URL, F.Zeitstempel AS F_Zeitstempel,
F.Text, F.sichtbar, F.Vorschau_Foto,
F.Foto,
AhLE.account_ID, AhLE.lehrmaterial_einsicht_ID,
LE.ID AS LE_ID, LE.Titel AS LE_Titel, LE.Beschreibung,
KhLE.klasse_ID, KhLE.lehrmaterial_einsicht_ID ,
AhK.account_ID, AhK.klasse_ID
FROM
fotos AS F,
lehrmaterial_einsicht AS LE,
account_has_klasse AS AhK
LEFT JOIN
account_has_lehrmaterial_einsicht AS AhLE
ON
LE.ID = AhLE.lehrmaterial_einsicht_ID
LEFT JOIN
klasse_has_lehrmaterial_einsicht AS KhLE
ON
AhK.klasse_ID = KhLE.klasse_ID
WHERE
AhLE.lehrmaterial_einsicht_ID IS NULL
AND KhLE.klasse_ID IS NULL
AND
(
LE.ID = F.lehrmaterial_einsicht_ID
AND F.sichtbar = '1'
OR
LE.ID = F.lehrmaterial_einsicht_ID
AND AhLE.account_ID = '".$Account_ID."'
AND AhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID
AND AhLE = IS NULL
OR
LE.ID = F.lehrmaterial_einsicht_ID
AND KhLE.klasse_ID = AhK.klasse_ID
AND AhK.account_ID = '".$Account_ID."'
AND KhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID
)
GROUP BY
LE.ID
ORDER BY
LE.ID ASC
|
17.11.2010, 23:19:47
|
|
Administrator
|
|
Registriert seit: Jul 2004
Beiträge: 3.707
|
|
AW: Ausgabe trotz leere Tabellen
1. Benutze bei/in Deinen Postings bitte Satzzeichen (nicht nur am Ende einer Zeile).
2. Lies Deinen Beitrag mindestens ein zweites Mal durch und beseitige Tipp- und Rechtschreibfehler.
3. Denn Du erwartest Hilfe, wir erwarten einen verständlichen und (fast) fehlerfreien Text.
4. Lies nochmals meine Bemerkungen unter 1., 2. und 3.
5. Was willst Du erreichen?
6. Was ist Dein Problem? Beschreibe Dein Problem so ausführlich wie nötig, so prägnant und verständlich wie möglich.
7. Wo ist die Fehlermeldung?
8. Wo ist (sind) die Tabellendefinition(en)?
9. ...
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert
Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!
Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
|
18.11.2010, 00:34:56
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Ausgabe trotz leere Tabellen
Gut Rechtschreibung und Grammatik hat der Spaß Homer eingesperrt, aber ich werde mich bemühen.
Ich denke das es zu erkennen ist welche Tabellen ich benutze, daher versuch ich mein Ziel besser zu erklären.
Es gibt verschiedene Rechte Vergabe Arten um Fotos nur für bestimmte Personen sichtbar zu machen.
Sichtbar = jeder kann die Fotos sehen
Lehrmaterial Einsicht = ein Account kann nur die ihm eingestellten Fotos sehen
Klasse = Die Klasse funkiert als Gruppe und alle Accounts in der Klasse können die Fotos sehen (ähnlich wie Lehrmaterial Einsicht)
Problem: Ist account_has_lehrmaterial_einsicht oder klasse_has_lehrmaterial_einsicht leer dann wird nichts ausgegeben, daher habe ich versucht mit Left Join zu arbeiten, womit ich noch nie gearbeitet habe und den Fehler nicht erkenne
die Fehlermeldung zeigt nur auf die stelle ab den ersten Left Join.
|
18.11.2010, 02:33:24
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Ausgabe trotz leere Tabellen
Hi
Punkt 1-6 sind geschafft.
Gib nich auf und geh auf
Zitat:
7. Wo ist die Fehlermeldung?
8. Wo ist (sind) die Tabellendefinition(en)?
|
ein.
mfg
CKaos
ps: so gings mir bei meinem ersten posting auch....
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
18.11.2010, 07:28:19
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Ausgabe trotz leere Tabellen
Zitat:
Zitat von McB_sser
Problem: Ist account_has_lehrmaterial_einsicht oder klasse_has_lehrmaterial_einsicht leer dann wird nichts ausgegeben, daher habe ich versucht mit Left Join zu arbeiten, womit ich noch nie gearbeitet habe und den Fehler nicht erkenne
die Fehlermeldung zeigt nur auf die stelle ab den ersten Left Join.
|
Ohne exakte Fehlermeldung kann ich nur folgendes vermuten:
Code:
...
FROM
fotos AS F,
lehrmaterial_einsicht AS LE,
account_has_klasse AS AhK
LEFT JOIN
account_has_lehrmaterial_einsicht AS AhLE
ON
LE.ID = AhLE.lehrmaterial_einsicht_ID
LEFT JOIN
klasse_has_lehrmaterial_einsicht AS KhLE
ON
AhK.klasse_ID = KhLE.klasse_ID
WHERE
...
Du vermischt Theta JOIN (old school join) mit ANSI JOIN. Das gibt bestimmte Reihenfolgeprobleme in der Abarbeitung der SQL-Abfrage, die ich hier beschrieben habe: http://www.twiedmann.de/sqlbackstube...oin_theta_join
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Geändert von thomas_w (18.11.2010 um 07:47:19 Uhr)
Grund: SQL ergänzt
|
18.11.2010, 12:45:52
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Ausgabe trotz leere Tabellen
ok, danke für deine vermutung und den Link. Ich habe nun versucht daraus was zu schreiben und bin momentan an der stelle.
PHP-Code:
SELECT F.ID AS F_ID, F.lehrmaterial_einsicht_ID, F.Titel AS F_Titel, F.Beschreibung AS F_Beschreibung, F.URL, F.Zeitstempel AS F_Zeitstempel, F.Text, F.sichtbar, F.Vorschau_Foto, F.Foto, AhLE.account_ID, AhLE.lehrmaterial_einsicht_ID, LE.ID AS LE_ID, LE.Titel AS LE_Titel, LE.Beschreibung, KhLE.klasse_ID, KhLE.lehrmaterial_einsicht_ID , AhK.account_ID, AhK.klasse_ID FROM lehrmaterial_einsicht AS LE JOIN account_has_lehrmaterial_einsicht AS AhLE ON AhLE.lehrmaterial_einsicht_ID = LE.ID, account_has_klasse AS AhK JOIN klasse_has_lehrmaterial_einsicht AS KhLE ON AhK.klasse_ID = KhLE.klasse_ID, fotos AS F WHERE LE.ID = F.lehrmaterial_einsicht_ID AND F.sichtbar = '1' OR LE.ID = F.lehrmaterial_einsicht_ID AND AhLE.account_ID = '".$Account_ID."' AND AhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID OR LE.ID = F.lehrmaterial_einsicht_ID AND KhLE.klasse_ID = AhK.klasse_ID AND AhK.account_ID = '".$Account_ID."' AND KhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID GROUP BY LE.ID ORDER BY LE.ID ASC
Ich bekomme so keinen fehler. Dennoch bekomme ich keine Ausgabe, wenn einer der beiden Tabellen leer sind. (KhLE, AhLE)
|
18.11.2010, 13:20:32
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Ausgabe trotz leere Tabellen
Vermutlich sind die LEFT JOIN schon notwendig. Das hattest Du ja schon herausgefunden.
Zudem könntest Du den SQL gleich komplett auf ANSI JOIN umschreiben.
Du hast da hinter der WHERE Klausel ein Mischmasch aus AND und OR . Dass versteht wahrscheinlich keiner ausser Dir und die Datenbank macht dann noch was anderes. Also entweder Klammern verwenden oder noch mal darüber nachdenken.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
18.11.2010, 13:37:13
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Ausgabe trotz leere Tabellen
OK, dann machen wir es jetzt ganz anders.
folgende Zeilen liefern das Gewünschte ergebniss:
PHP-Code:
SELECT
F.ID AS F_ID, F.lehrmaterial_einsicht_ID, F.Titel AS F_Titel,
F.Beschreibung AS F_Beschreibung, F.URL, F.Zeitstempel AS F_Zeitstempel,
F.Text, F.sichtbar, F.Vorschau_Foto,
F.Foto,
AhLE.account_ID, AhLE.lehrmaterial_einsicht_ID,
LE.ID AS LE_ID, LE.Titel AS LE_Titel, LE.Beschreibung,
KhLE.klasse_ID, KhLE.lehrmaterial_einsicht_ID ,
AhK.account_ID, AhK.klasse_ID
FROM
lehrmaterial_einsicht AS LE,
account_has_lehrmaterial_einsicht AS AhLE,
account_has_klasse AS AhK,
klasse_has_lehrmaterial_einsicht AS KhLE,
fotos AS F
WHERE
LE.ID = F.lehrmaterial_einsicht_ID
AND F.sichtbar = '1'
OR
LE.ID = F.lehrmaterial_einsicht_ID
AND AhLE.account_ID = '".$Account_ID."'
AND AhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID
OR
LE.ID = F.lehrmaterial_einsicht_ID
AND KhLE.klasse_ID = AhK.klasse_ID
AND AhK.account_ID = '".$Account_ID."'
AND KhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID
GROUP BY
LE.ID
ORDER BY
LE.ID ASC
... aber wenn einer der beiden (KhLE, AhLE) leer sind bekomme ich keine Ausgabe.
Was muss ich machen das wenn z. B. KhLe - die Klasse ein leeren inhalt hat trotzdem noch AhLE - Account prüft und Daten ausgibt.
LEFT JOIN war mein erster versuch... kann sein das es das ist was ich suche aber falsch einsetze.
Ihr braucht im grunde mir nur zu sagen was ich machen muss ggf. das join und das notwendige drumherum richtig Platzieren. So das ich dieses ergebnis auch ohne einen eintrag in einer der jeweiligen Tabellen bekomme.
|
18.11.2010, 14:01:01
|
|
Administrator
|
|
Registriert seit: Jul 2004
Beiträge: 3.707
|
|
AW: Ausgabe trotz leere Tabellen
Zitat:
Zitat von McB_sser
[..]
Was muss ich machen ...
Ihr braucht im grunde mir nur zu sagen was ich machen muss ...
|
Zum besseren Verständnis bräuchten wir folgendes:
Code:
mysql>
SHOW CREATE TABLE lehrmaterial_einsicht;
SHOW CREATE TABLE account_has_lehrmaterial_einsicht;
SHOW CREATE TABLE account_has_klasse
SHOW CREATE TABLE klasse_has_lehrmaterial_einsicht
SHOW CREATE TABLE fotos
Und natürlich eine paar (aussagekräftige) Testdaten je Tabelle.
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert
Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!
Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
|
18.11.2010, 14:20:42
|
Anfänger
|
|
Registriert seit: Apr 2008
Beiträge: 66
|
|
AW: Ausgabe trotz leere Tabellen
Boing, ach das meinst du.
PHP-Code:
CREATE TABLE fotos (
ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
lehrmaterial_einsicht_ID INTEGER UNSIGNED NOT NULL,
Titel VARCHAR(45) NULL,
Beschreibung VARCHAR(255) NULL,
URL VARCHAR(255) NULL,
Zeitstempel TIMESTAMP NULL,
Text TEXT NULL,
sichtbar TINYINT UNSIGNED NULL,
Vorschau_Foto BLOB NULL,
Foto MEDIUMBLOB NULL,
PRIMARY KEY(ID),
INDEX fotos_FKIndex1(lehrmaterial_einsicht_ID)
);
PHP-Code:
CREATE TABLE account_has_klasse (
account_ID INTEGER UNSIGNED NOT NULL,
klasse_ID INTEGER UNSIGNED NOT NULL,
PRIMARY KEY(account_ID, klasse_ID),
INDEX account_has_klasse_FKIndex1(account_ID),
INDEX account_has_klasse_FKIndex2(klasse_ID)
);
INSERT INTO `account_has_klasse` VALUES (1, 1);
PHP-Code:
CREATE TABLE klasse_has_lehrmaterial_einsicht (
klasse_ID INTEGER UNSIGNED NOT NULL,
lehrmaterial_einsicht_ID INTEGER UNSIGNED NOT NULL,
PRIMARY KEY(klasse_ID, lehrmaterial_einsicht_ID),
INDEX klasse_has_lehrmaterial_einsicht_FKIndex1(klasse_ID),
INDEX klasse_has_lehrmaterial_einsicht_FKIndex2(lehrmaterial_einsicht_ID)
);
INSERT INTO `klasse_has_lehrmaterial_einsicht` VALUES (1, 3);
PHP-Code:
CREATE TABLE lehrmaterial_einsicht (
ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
Titel VARCHAR(20) NULL,
Beschreibung VARCHAR(255) NULL,
PRIMARY KEY(ID)
);
INSERT INTO `lehrmaterial_einsicht` VALUES (1, '1. Tag', 'Video und Bilder sowie Schriftzeug für den 1. Tag');
INSERT INTO `lehrmaterial_einsicht` VALUES (2, 'Weihnachtsfest 2010', 'test test');
INSERT INTO `lehrmaterial_einsicht` VALUES (3, 'Sonstiges', 'Unsortierte Bilder, Videos etc.');
PHP-Code:
CREATE TABLE account_has_lehrmaterial_einsicht (
account_ID INTEGER UNSIGNED NOT NULL,
lehrmaterial_einsicht_ID INTEGER UNSIGNED NOT NULL,
PRIMARY KEY(account_ID, lehrmaterial_einsicht_ID),
INDEX account_has_lehrmaterial_einsicht_FKIndex1(account_ID),
INDEX account_has_lehrmaterial_einsicht_FKIndex2(lehrmaterial_einsicht_ID)
);
INSERT INTO `account_has_lehrmaterial_einsicht` VALUES (1, 3);
INSERT INTO `account_has_lehrmaterial_einsicht` VALUES (4, 1);
INSERT INTO `account_has_lehrmaterial_einsicht` VALUES (8, 2);
EDIT
mein gepostete abfrage ist für das menü und hier noch das für die daten
(normal ohne join und mit komata... ergab sich nur aus den experiment)
PHP-Code:
SELECT
F.ID AS F_ID, F.lehrmaterial_einsicht_ID, F.Titel AS F_Titel,
F.Beschreibung AS F_Beschreibung, F.URL, F.Zeitstempel AS F_Zeitstempel,
F.Text, F.sichtbar, F.Vorschau_Foto,
F.Foto,
AhLE.account_ID, AhLE.lehrmaterial_einsicht_ID,
LE.ID AS LE_ID, LE.Titel AS LE_Titel, LE.Beschreibung,
KhLE.klasse_ID, KhLE.lehrmaterial_einsicht_ID ,
AhK.account_ID, AhK.klasse_ID
FROM
lehrmaterial_einsicht AS LE
JOIN
account_has_lehrmaterial_einsicht AS AhLE
ON
AhLE.lehrmaterial_einsicht_ID = LE.ID,
account_has_klasse AS AhK
JOIN
klasse_has_lehrmaterial_einsicht AS KhLE
ON
AhK.klasse_ID = KhLE.klasse_ID,
fotos AS F
WHERE
F.lehrmaterial_einsicht_ID = '".$GET_lehrmaterial_einsicht_ID."'
AND LE.ID = F.lehrmaterial_einsicht_ID
AND F.sichtbar = '1'
OR
F.lehrmaterial_einsicht_ID = '".$GET_lehrmaterial_einsicht_ID."'
AND LE.ID = F.lehrmaterial_einsicht_ID
AND AhLE.account_ID = '".$Account_ID."'
AND AhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID
OR
F.lehrmaterial_einsicht_ID = '".$GET_lehrmaterial_einsicht_ID."'
AND LE.ID = F.lehrmaterial_einsicht_ID
AND KhLE.klasse_ID = AhK.klasse_ID
AND AhK.account_ID = '".$Account_ID."'
AND KhLE.lehrmaterial_einsicht_ID = F.lehrmaterial_einsicht_ID
GROUP BY
F.ID
ORDER BY
F.Zeitstempel DESC
Geändert von vt1816 (18.11.2010 um 14:37:20 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 06:24:31 Uhr.
|