MySQL Abfrage mit 2 Tabellen und einer Bedingung

hansbiedemann

Grünschnabel
Also ich hoffe ihr kennt euch aus aber ich stehe im Moment schon seit Stunden auf dem Schlauch,
also es geht um folgendes:

- Eine Tabelle pf_user (Benutzer), wo wir jeweils die Nutzerdaten raussuchen
- Eine Tabelle pf_mailbox (Nachrichten), wo wir jeweils Absender (abs) und Empfänger (empf) brauchen

Nun soll mir eine Abfrage von einem ganz bestimmten User (meinetwegen ID 8) alle anderen User auflisten, zu dem er noch keinen Kontakt hatte (sprich Austausch via der Mailbox-Tabelle)

Habe es bisher so gelöst:

SQL:
SELECT * FROM pf_user WHERE plz LIKE '".$s_plz."%'

Dann quasi nochmal in der Schleife in PHP Zur Ausgabe aller passenden anderen User Eine Abfrage ob Kontakt bestanden hat:

PHP:
$query2 = ("SELECT * FROM pf_mailbox WHERE (empf='".DER DAZU PASSENDE USER AUS PLZ."' AND abs='".DER EINE GANZ BESTIMMTE USER."') OR (abs='".DER DAZU PASSENDE USER AUS PLZ."' AND empf='".DER EINE GANZ BESTIMMTE USER."')");

$menge2 = mysql_num_rows($query2);
if($menge2 == 0){

-- Falls kein Kontakt bestanden hat der beiden schon per Nachricht dann hier echo mit dem Usernamen etc.., ansonsten keine Ausgabe

}

So, nun frage ich mal die Experten - wie kann man das mit EINER MySQL-Abfrage lösen ohne nochmal das IF-Script zu benutzen?
Also quasi gleich alle passenden raussuchen wo noch kein Nachrichten-Kontakt bestand, quasi alle beiden Abfragen zusammen in einer?

Zerbreche mir schon seit Stunden den Kopf aber bekomme es einfach nicht hin
 
Zuletzt bearbeitet von einem Moderator:
Danke dir, ja das mit dem Left join hab ich vorhin schon probiert aber vor Verzweiflung hab ich das dann aufgegeben... Ist wirklich ne harte Nuss das ganze...
 
Dazu müsste man mal die Tabellen genauer kennen.
Wie stehen die Spalten in verbindung mit den anderen Tabellen?
kannst du uns die beiden Tabellen mal hier genauer beschreiben?
 
Ja, also wie folgt:

PHP:
CREATE TABLE IF NOT EXISTS `pf_mailbox` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `abs` bigint(20) NOT NULL DEFAULT '0',
  `empf` bigint(20) NOT NULL DEFAULT '0',
  `titel` varchar(80) NOT NULL DEFAULT '',
  `text` text NOT NULL,
  `datum` bigint(20) NOT NULL DEFAULT '0',
  `sa` char(2) NOT NULL DEFAULT '',
  `se` char(2) NOT NULL DEFAULT '',
  `readed` varchar(255) NOT NULL DEFAULT '0',
  `deleted` varchar(255) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34709 ;

PHP:
CREATE TABLE IF NOT EXISTS `pf_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user` varchar(50) NOT NULL DEFAULT '',
  `pass` varchar(50) NOT NULL DEFAULT '',
  `vorname` varchar(50) NOT NULL DEFAULT '',
  `nachname` varchar(50) NOT NULL DEFAULT '',
  `plz` varchar(5) NOT NULL DEFAULT '0',
  `ort` varchar(50) NOT NULL DEFAULT '',
  `email` varchar(50) NOT NULL DEFAULT '',
  `geburtsdatum` bigint(20) NOT NULL DEFAULT '0',
  `geschlecht` char(1) NOT NULL DEFAULT '',
  `status` char(2) NOT NULL DEFAULT '',
  `datum` bigint(20) NOT NULL DEFAULT '0',
  `last_aktiv` varchar(255) NOT NULL,
  `ip` varchar(255) NOT NULL,
  `referer` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2119 ;

Also quasi soll er von einem bestimmten User (anhand ID) passende Gegenstücke finden (also User) anhand der PLZ, jedoch nur welche Ausgeben zu der noch kein Kontakt per Nachricht bestand (also gleichzeitig in der Mailbox Table schauen)

Also in einer Abfrage, wenn das einer hinbekommen würde wäre eine 5€ Spende per PayPal von mir auf jedenfall gesichert.
 
Zuletzt bearbeitet:
"abs" und "empf" können ja somit die gleiche ID in verschiedenen Zeilen haben, richtig?

Du möchtest quasi alle User welche in der mailbox-Tabelle noch keinen kontakt mit der gegebenen ID hatten?

zb.: UserID: 8
SQL:
select id from pf_user where plz = '12345';
SQL:
select * from pf_mailbox where empf <> 8 and abs <> 8;

und diese beiden zusammenführen?
 
Ja, also es soll der User im Loginbereich eine Liste angezeigt bekommen mit allen Usern als Vorschlägen zu der er selber noch keinen Kontakt hatte (in der selben PLZ). Deshalb muss ja gleichzeitig die Mailbox-Tabelle mit her, und ja also empf oder abs könnte beides den eingeloggten User enthalten (also praktisch hat er einen evlt. schonmal angeschrieben, oder hat eine Nachricht von ihm). Und er soll eben alle ausgeben, zu der noch kein Kontakt bestand per Nachricht.

Wäre absolut spitze, wenn du das hinbekommen würdest. (Also die 8 ist nur eine Bespiel-user-ID, ersetze die dann später wieder durch die Variable nach dem Test in phpMyAdmin).
 
also am einfachsten würde es mit subselects gehen, aber ob das die performanteste lösung ist weiß ich nicht:

SQL:
select * from pf_user where plz = 12345 and id not in (select empf from pf_mailbox) and id not in (select empf from pf_mailbox)
 
Danke dir ich probiere mal, wenns geht schreib ich dir nochmal wegen deiner PayPal-Addi. Arbeit soll ja nicht umsonst sein!

Edit:

Also habs jetzt so gemacht:

PHP:
SELECT * FROM pf_user WHERE plz = '12345' AND id NOT IN (SELECT empf FROM pf_mailbox WHERE abs = '8') AND id NOT IN (SELECT abs FROM pf_mailbox WHERE empf = '8')

Geb mir mal deine PayPal-Addi per PN, bekommst 3€ von mir. Wenn du noch eine mit mehr Perfomance hast dann natürlich 5€.
 
Zuletzt bearbeitet:
Danke aber ich erwarte keine Belohnung :)
Wir sind hier in einem Hilfe-Forum, für sowas sind wir da.
User helfen User ;-)

Die abfrage in den Subselects ob die empf oder abs gleich der userid ist brauchste normal gar nicht ;-)
 

Neue Beiträge

Zurück