php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.05.2009, 19:11  
Registrierer
Gast
 
Beiträge: n/a
Standard [Erledigt] SQL Abfrage über 2 Tabellen, wenn eine davon leer ist

Hallo Gemeinde,

ich habe zwei Tabellen die identische im Aufbau sind.
Ich frage ab mit:
PHP-Code:
SELECT FROM Tabelle1 Tabelle2 
und das Ergebnis ist, wenn Tabelle2 leer ist immer NULL! Obwohl Tabelle1 voll ist.
Erst wenn mindestens 1 Datensatz in Tabelle2 vorhanden ist lässt sich eine Abfrage durchführen.
Muss man davon ausgehen, das eine Tabelle nicht leer sein darf?

Danke, Helmut
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.05.2009, 19:15  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Du machst einen impliziten (INNER-)JOIN. Wenn du ein anderes Ergebnis haben willst, musst du z.B. einen LEFT JOIN machen. Mehr dazu per Google. Bei SelfHTML gibt es auch einen guten Einsteigerartikel zu JOINs.

Themenmoderation:
[→] Verschoben von PHP Einsteiger
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 18.05.2009, 19:19  
Registrierer
Gast
 
Beiträge: n/a
Standard

Ich hab es mit Inner Join, Outer Join, Left Join, Right Join, Left Outer Join und Right Outer Join versucht.
Das Ergebnis bleibt NULL.
  Mit Zitat antworten
Alt 18.05.2009, 19:22  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Dann hast du es nicht richtig gemacht.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 18.05.2009, 19:30  
Registrierer
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Manko10 Beitrag anzeigen
Dann hast du es nicht richtig gemacht.
wirklich lieb von Dir, aber was ist nicht richtig?

PHP-Code:
SELECT
users
.UserName,
users.UserMail,
users_temp.UserName,
users_temp.UserMail
FROM
users
Inner Join users_temp ON users
.UserName users_temp.UserName 
oder

PHP-Code:
SELECT
users
.UserName,
users.UserMail,
users_temp.UserName,
users_temp.UserMail
FROM
users
Inner Join users_temp ON users
.UserName users_temp.UserName AND users.UserMail users_temp.UserMail 
  Mit Zitat antworten
Alt 18.05.2009, 19:35  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Ist dir der Unterschied zwischen LEFT JOIN, RIGHT JOIN und INNER JOIN bekannt? Wenn nicht, solltest du den vorher nochmal nachlesen.
Code:
SELECT * FROM Tabelle1 a
LEFT JOIN Tabelle2 b ON a.id = b.foreignId;
Das ist das Schema. Hierbei dürfen ruhig entsprechende Einträge in Tabelle2 fehlen, in dem Falle werden dann die Daten aus Tabelle1 ausgelesen und die Spalten aus Tabelle2 mit NULL aufgefüllt. Du musst natürlich noch beachten, dass die WHERE-Bedingung nicht von Tabelle2 abhängig sein darf.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 18.05.2009, 19:48  
Registrierer
Gast
 
Beiträge: n/a
Standard

Einschränkungen mit WHERE hab ich erstmal bewusst weggelassen.
Ich wiederhole vielleicht nochmal die Fragestellung, bzw. das Problem:

Wenn Tabelle1 sagen wir 100 Einträge hat und Tabelle2 1 Eintrag erhalte ich in der Abfrage 101 Datensätze. Hat Tabelle2 keinen Eintrag erhalte ich immer NULL.

Es geht mir also nicht um doppelte oder falsche Ausgaben, sondern um NULL!

Denn die Abfrage lautet ja auf Deutsch "Zeige alles von Tabelle1 und Tabelle2", da sollte 100 rauskommen und nicht NULL bloß weil Tabelle2 leer ist, denn wenn Tabelle2 1 Datensatz enthällt kommen ja auch 101 raus.
  Mit Zitat antworten
Alt 18.05.2009, 19:55  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Das hört sich irgendwie nach »Meine Tabelle ist zu groß, ich mache zwei draus« an. Wenn du keine vernünftige und logischen Beziehung darstellen kannst, wird das natürlich auch nichts. Alle Datensätze aus zwei Tabellen gleichzeitig auszugeben, ohne diese untereinander zu verknüpfen ist nicht der Zweck der Normalisierung.
Poste doch mal ein wenig mehr über das, was du versuchst und zwar mit realem Code.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 18.05.2009, 20:10  
Registrierer
Gast
 
Beiträge: n/a
Standard

Klar, gerne...
Sinn der 2 Tabellen ist, Benutzer kann sich registrieren und wird temporär in Tabelle2 eingetragen. Meldet er sich tatsächlich dann an, wird der Eintrag aus Tabelle2 nach Tabelle1 VERSCHOBEN und als realer Benutzer eingetragen.
Sonst hätte ich möglicherweise jedemenge "Benutzerleichen" in meiner Benutzertabelle, wenn nach der Erstregistrierung nichts mehr passiert.
Tabelle1 -> users mit 4 Einträgen
PHP-Code:
CREATE TABLE IF NOT EXISTS `users` (
  `
UserIDint(11NOT NULL AUTO_INCREMENT,
  `
UserNamevarchar(30NOT NULL DEFAULT '',
  `
UserPassvarchar(32NOT NULL DEFAULT '',
  `
UserSessionvarchar(32) DEFAULT NULL,
  `
UserMailvarchar(150) DEFAULT NULL,
  `
Adminint(2) DEFAULT NULL,
  `
dummyint(1) DEFAULT NULL,
  `
kal_usetinyint(1) DEFAULT NULL,
  `
gal_usetinyint(1) DEFAULT NULL,
  `
ind_usetinyint(1) DEFAULT NULL,
  `
gast_usetinyint(1) DEFAULT NULL,
  `
kontakt_usetinyint(1) DEFAULT NULL,
  `
publictinyint(1) DEFAULT NULL,
  
PRIMARY KEY (`UserID`),
  
UNIQUE KEY `UserName` (`UserName`),
  
UNIQUE KEY `UserMail` (`UserMail`)
ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=45 ;

--
-- 
Daten für Tabelle `users`
--

INSERT INTO `users` (`UserID`, `UserName`, `UserPass`, `UserSession`, `UserMail`, `Admin`, `dummy`, `kal_use`, `gal_use`, `ind_use`, `gast_use`, `kontakt_use`, `public`) VALUES
(1'Öffentlich (für alle sichtbar)'''NULL'info@localhost.eu'00000001),
(
2'Helmut''026b7aa1b4aca10b91aa895bda702301'NULL'info@localhost.de'10111110),
(
43'Carmen''337db052b7b97695533184d581b79917''''post@localhost.de'00100000),
(
44'dummy''5a105e8b9d40e1329780d62ea2265d8a''''test@localhost.de'00000000); 
Tabelle2 -> users_temp mit 0 Einträgen
PHP-Code:
CREATE TABLE IF NOT EXISTS `users_temp` (
  `
UserIDint(11NOT NULL AUTO_INCREMENT,
  `
UserNamevarchar(30NOT NULL DEFAULT '',
  `
UserPassvarchar(32NOT NULL DEFAULT '',
  `
UserMailvarchar(150) DEFAULT NULL,
  
PRIMARY KEY (`UserID`),
  
UNIQUE KEY `UserName` (`UserName`),
  
UNIQUE KEY `UserMail` (`UserMail`)
ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=49 
Die Abfrage

PHP-Code:
SELECT FROM users users_temp 
gibt NULL Datensätze aus.

Enthält users_temp 1 Datensatz, werden 4 Datensätze ausgegeben.
  Mit Zitat antworten
Alt 18.05.2009, 20:21  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Dafür solltest du dann keinen JOIN, sondern ein UNION verwenden, da es sich hier um eine Zusammenfassung, keine Beziehung handelt.
Ich halte deine Vorgehensweise dennoch für merkwürdig. Ich würde das eher über einen Schalter lösen und Karteileichen per Cronjob alle x Tage/Wochen/Monate löschen.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySQL Abfrage über 5 Tabellen evtl. IF ghost120 Datenbanken 11 13.04.2009 20:00
Query über mehrere Tabellen ph|L Datenbanken 3 07.04.2009 14:26
sortierung einer Abfrage über 2 Tabellen mchacka Datenbanken 2 17.03.2009 17:55
SELECT über zwei Tabellen KingCrunch Datenbanken 9 23.03.2007 04:01
Update über zwei Tabellen tekknotrip Datenbanken 2 26.02.2007 16:25
MySQL Abfrage über 2 Tabellen Datenbanken 4 21.03.2006 11:44
Abfrage über zwei Tabellen (m. JOIN?) Spiff Datenbanken 3 13.02.2006 09:32
Join-Abfrage über mehrere Tabellen sinai Datenbanken 3 04.02.2006 13:05
Select über mehrere tabellen Sclot Datenbanken 14 24.11.2005 16:56
[Erledigt] MySQL Abfrage über mehrere Tabellen [Erledigt] Datenbanken 2 14.10.2005 13:37
[Erledigt] mysql abfrage über 4 Tabelle - bis 3 geht, bei der 4. habert Datenbanken 2 08.09.2005 11:59
Mysql Abfrage über 2 Tabellen mit Verknüpfung zuner 3. Datenbanken 2 26.10.2004 16:36
Abfrage über 2 tabellen mit NOT IN Datenbanken 3 25.10.2004 16:49
2 Tabellen 1 Abfrage nilsfeld Datenbanken 6 11.08.2004 11:18
Abfrage über 3 Tabellen PHP Tipps 2004 3 31.07.2004 22:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
join leere tabelle, sql select leere tabelle, inner join leere tabelle, sql join leere tabelle, sql inner join tabelle leer, http://www.php.de/datenbanken/55222-erledigt-sql-abfrage-ueber-2-tabellen-wenn-eine-davon-leer-ist.html, sql join mit leerer tabelle, sql join leer, sql wenn tabelle leer, inner join leer, sql abfrage nullen auffüllen, sql wenn leer dann, right join mit leerer tabelle, join mit leerer tabelle, sql join bestimmten tabelle leer, select join leer, mysql join ergebnis auch wenn eine tabele leer ist, join eine tabelle leer, sql left join leere tabelle, keine beziehung zwischen zwei tabellen sql

Alle Zeitangaben in WEZ +2. Es ist jetzt 07:58 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum