[php] query aus 2 Tabellen

quicksilver

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
363
Ich habe ein kleines download script geschrieben. Dies script umfasst mehrere Kategorien. Nun habe ich vor die Kategorien aufzulisten ohne Kategorien anzuzeigen die keine Downloads enthalten. Meine ausgabe sieht im moment so aus.

PHP:
$query = "SELECT DISTINCT * FROM $v_cat,$v_file WHERE $v_cat.id_cat=$v_file.cat AND view='1'";
$result = mysql_query($query) or die (mysql_error());

while ($array=mysql_fetch_array($result)) {

... Ausgabe .. die wollte ich euch ersparen.
}

hier die die Tabellen:

Code:
CREATE TABLE `dl_cat` (
  `id_cat` int(8) NOT NULL auto_increment,
  `name_cat` varchar(255) NOT NULL default '',
  `view` int(1) NOT NULL default '1',
  PRIMARY KEY  (`id_cat`)
) TYPE=MyISAM AUTO_INCREMENT=19 ;

#
# Daten für Tabelle `dl_cat`
#
INSERT INTO `dl_cat` VALUES (1, 'Tools', 1);
INSERT INTO `dl_cat` VALUES (16, 'Game Updates', 1);
INSERT INTO `dl_cat` VALUES (15, 'Mini-Games', 1);

CREATE TABLE `dl_files` (
  `id_file` int(8) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '',
  `url` varchar(255) NOT NULL default '',
  `date` date NOT NULL default '0000-00-00',
  `counter` int(8) NOT NULL default '0',
  `cat` int(8) NOT NULL default '0',
  `beschreibung` text NOT NULL,
  PRIMARY KEY  (`id_file`)
) TYPE=MyISAM AUTO_INCREMENT=28 ;

#
# Daten für Tabelle `dl_files`
#

INSERT INTO `dl_files` VALUES (16, 'Schneeballschlacht', 'files/schneeballschlacht.zip', '2004-11-29', 1936, 15, 'Süßes Spiel zum Zeitvertreib');
INSERT INTO `dl_files` VALUES (20, 'Movie Starter', 'files/moviestarter.exe', '2004-11-29', 301, 1, 'Mein 1. Tool :) ..Zum start von Divx Files');
INSERT INTO `dl_files` VALUES (23, 'Micro', 'files/micro2.zip', '2004-11-29', 1127, 15, 'Kleines Denkspiel.. echt süss');
INSERT INTO `dl_files` VALUES (27, 'HLSW Start (Mirc Addon)', 'files/mircscripte/hlsw_ip.zip', '2004-11-29', 66, 1, 'Startet Hlsw');

irgendwas muss also am query falsch sein ich weiss aber leider nicht was. Ich möchte also Nur Kategorien Anzeigen die auch mit daten gefüllt sind und den wert 1 in der spalte view haben. Also sollte bei der Ausgabe die Kategorie Game Updates Nicht angezeigt werden.

Das Ergebnis sieht dann so aus:

Code:
Mini-Games
Schneeballschlacht
Micro
 
Tools
Movie Starter
HLSW Start (Mirc Addon)
 
Mini-Games
Schneeballschlacht
Micro
 
Tools
Movie Starter
HLSW Start (Mirc Addon)

Der Query sieht so aus im echo:

PHP:
SELECT DISTINCT * FROM dl_cat,dl_files WHERE dl_cat.id_cat=dl_files.cat AND view='1'

Ich weiss nicht warum er das 2x ausgibt :(
 
In der modernen SQL-Sprache kann folgendes Statement benutzt werden:

SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);

oder
SELECT * FROM t1 WHERE EXISTS (SELECT id FROM t2 where t2.id = t1.t2id);

Bei älteren MySQL-Versionen sollte man folgende Variante benutzen:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;

Wobei table2 hier auf NULL also ein NICHTS überprüft wird. Somit werden von table1 nur elemente ausgegeben die nicht in table2 verknüpft sind.

Für dein Statment würde das so aussehen:
SELECT DISTINCT * FROM dl_cat LEFT JOIN dl_files ON dl_cat.id_cat=dl_files.cat
WHERE view='1' and id_file = NULL;
 
Ich habe nun den untersten query genommen und nun gibt er garnichts mehr aus.
 
Ja ich habs gefunden.
Anstatt 'id_file = NULL' musst du 'id_file IS NULL' angeben. Dann wird es gehen.

Das volle Statement im Test sah so aus.
SELECT DISTINCT * FROM dl_cat LEFT JOIN dl_files ON dl_cat.id_cat=dl_files.cat
WHERE view='1' and id_file IS NULL LIMIT 0, 30
 
Du hast mich total verwirrt :)

Jetzt hab ichs, du willst alle haben die downloads haben und nicht die, die kein ehaben. Sag das doch gleich :)

Das er das 2 mal ausgibt ist normal, weil 2x2, 4 ergibt.

Du hast 2 pro Kategorie, also muss er bei diesem Statement auch 2 ausgeben.
Wenn du also nur die Kategorien ausgeben willst, dann musst du ein anderes Statement benutzen, ein simpleres.

select distinct dl_cat.* from dl_cat, dl_files
where dl_cat.id_cat = dl_files.cat


Viel Spaß damit.
 
Zurück
Oben