php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 08-09-2008, 17:40
treebeard
 Newbie
Links : Onlinestatus : treebeard ist offline
Registriert seit: Sep 2008
Beiträge: 5
treebeard ist zur Zeit noch ein unbeschriebenes Blatt
Standard Ausschlusskriterien innerhalb einer Tabelle

Nach erfolglosem Suchen und Recherchieren komme ich nicht vom Schlauch herunter.

Ausgangssituation Tabelle temp mit 4 Datensätzen:

CREATE TABLE `temp` (
`krid` varchar(10) NOT NULL default '',
`katid` varchar(10) NOT NULL default ''
) TYPE=MyISAM;

INSERT INTO `temp` (`krid`, `katid`) VALUES
('kr1', '1'),
('kr2', '2'),
('kr3', '1'),
('kr3', '3');

Ich möchte alle Datensätze selektieren, die nicht in katid 3 enthalten sind. Das Problem liegt bei kr3, das in katid 1 und 3 enthalten ist. Sozusagen ist katid ein Ausschlußkriterium und daher soll bei einem SELECT auch kr3 nicht ausgegeben werden. Habe nun schon alles mögliche probiert mit LEFT JOINS, INNER JOINS etc., hat alles nicht geklappt. Weiß ehrlich auch nicht genau wie ich hier weiter vorgehen soll.

Subqueries sind leider bei Mysql 4.0.27 nicht erlaubt.

Als Ergebnis erwarte ich
krid | katid
kr1 | 1
kr2 | 2

Helft mir! Wäre super, wenn wir die Lösung hinbekommen.
Mit Zitat antworten
  #2 (permalink)  
Alt 08-09-2008, 17:53
TheFish511
 Newbie
Links : Onlinestatus : TheFish511 ist offline
Registriert seit: Feb 2008
Beiträge: 76
TheFish511 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Habe nun schon alles mögliche probiert mit LEFT JOINS, INNER JOINS etc., hat alles nicht geklappt. Weiß ehrlich auch nicht genau wie ich hier weiter vorgehen soll.
Hmm, dann zeig doch mal deine Ansätze. So wie ich das sehe, reden wir über nur eine Tabelle und deswegen sind JOINs hier fehl am Platz.

Was du genau haben willst, habe ich leider auch noch nicht ganz verstanden. Du willst alle Daten habe, wo katid != 3? Und was ist jetzt mit krid gleich 1 oder 3. Krid darf auch nicht 3 sein? Das habe ich nicht genau verstanden.

Ahja, warum sind deine ids eigentlich vom Typ varchar? Warum geht INT nicht?
Mit Zitat antworten
  #3 (permalink)  
Alt 08-09-2008, 18:15
treebeard
 Newbie
Links : Onlinestatus : treebeard ist offline
Registriert seit: Sep 2008
Beiträge: 5
treebeard ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Sorry für das Varchar, natürlich sind die Daten in der Live-DB als INT. Habe das Beispiel soweit vereinfacht und die 4 Datensätze nur mal als Beispiel eingegeben.

Hier die Korrektur:
CREATE TABLE `temp` (
`krid` int(11) NOT NULL default '0',
`katid` int(11) NOT NULL default '0'
) TYPE=MyISAM;


INSERT INTO `temp` (`krid`, `katid`) VALUES
(1, 1),
(2, 2),
(3, 1),
(3, 3);

Und ja, es handelt sich hierbei nur um eine Tabelle.

Mein Ziel in Worten:
krid 3 ist sowohl katid 3 als auch katid 1 zugeordnet und soll deshalb in der Ergebnismenge nicht angezeigt werden, da katid = 3 ein Ausschlusskriterium sein soll. Wenn ich jetzt aber über einen
SELECT krid FROM temp WHERE katid <> '3' selektiere, bekomme ich 3 Datensätze inklusive krid 3 angezeigt.

Meine Joins kann ich nicht präsentieren, es hat einfach nicht geklappt. Mir fehlt einfach der Denkansatz, wie ich hier das Ausschlusskriterium definiere.

Ich hoffe, es war einigermassen verständlich.
Mit Zitat antworten
  #4 (permalink)  
Alt 08-09-2008, 18:33
TheFish511
 Newbie
Links : Onlinestatus : TheFish511 ist offline
Registriert seit: Feb 2008
Beiträge: 76
TheFish511 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Meine Joins kann ich nicht präsentieren, es hat einfach nicht geklappt.
Natürlich klappen Joins nicht, da Joins, wie der Name schon sagt, 2 oder mehr Tabellen zusammenführen. Bei lediglich einer Tabelle macht das keinen Sinn.

Code:
SELECT krid, katid FROM temp WHERE krid != 3 AND katid != 3

Geändert von TheFish511 (08-09-2008 um 18:36 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 08-09-2008, 21:35
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Natürlich klappen Joins nicht, da Joins, wie der Name schon sagt, 2 oder mehr Tabellen zusammenführen. Bei lediglich einer Tabelle macht das keinen Sinn.
So ein Unsinn. Du kannst selbstverständlich Die Tabelle mit sich selbst Joinen!
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #6 (permalink)  
Alt 08-09-2008, 22:23
TheFish511
 Newbie
Links : Onlinestatus : TheFish511 ist offline
Registriert seit: Feb 2008
Beiträge: 76
TheFish511 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hmm stimmt, hast recht. Hatte ich davor noch nie gesehen ... Man lernt eben nie aus.
Mit Zitat antworten
  #7 (permalink)  
Alt 09-09-2008, 05:15
treebeard
 Newbie
Links : Onlinestatus : treebeard ist offline
Registriert seit: Sep 2008
Beiträge: 5
treebeard ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke für den Vorschlag.

Zitat:
Code:
SELECT krid, katid FROM temp WHERE krid != 3 AND katid != 3
Das führt zwar in diesem Beispiel zum Ergebnis, ist aber nicht zufrieden stellend, da krid unbekannt ist. krid = 3 scheidet nur aus, da es auch der katid = 3 zugeordnet ist.

Ein weiteres Beispiel zur Verdeutlichung.

INSERT INTO `temp` (`krid`, `katid`) VALUES
(1, 1),
(2, 2),
(3, 1),
(3, 3),
(4, 2),
(5, 3),
(6, 1),
(6, 2),
(6, 3),
(7, 1),
(8, 1),
(8, 2),
(9, 3),
(10, 1),
(10, 3),
(11, 1);

krid 3, 5, 6, 9, 10 sind in der Tabelle irgendwann der katid 3 zugeordnet, diese sollen also raus:

SELECT * FROM `temp` WHERE `katid` = 3

Jetzt muss ich irgendwie der Tabelle temp beibringen, diese Ergebnismenge der krids "rauszufiltern".

Any Ideas?
Mit Zitat antworten
  #8 (permalink)  
Alt 09-09-2008, 06:28
treebeard
 Newbie
Links : Onlinestatus : treebeard ist offline
Registriert seit: Sep 2008
Beiträge: 5
treebeard ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Falls es weiter hilft, hier meine Bemühungen, was ich bisher getestet habe:

Code:
SELECT * FROM `temp` t1 LEFT JOIN temp t2 ON t1.katid = 3
SELECT krid FROM `temp` t1 WHERE t1.katid = 3 NOT IN t1.katid
=> Error

Code:
SELECT krid, COUNT(t1.katid<>3) AS katid3counter FROM `temp` t1 GROUP BY t1.krid => t1.katid<>3
=> scheint nicht ausgewertet zu werden

Code:
SELECT krid, IF(katid=3, 'WAHR', 'FALSCH') AS katid3counter FROM `temp` t1 GROUP BY t1.krid
=> GROUP BY verhindert Auflistung der gefundenen Elemente

Code:
SELECT krid, COUNT(IF(katid=3, 'WAHR', 'FALSCH')) AS katid3counter FROM `temp` t1 GROUP BY t1.krid
=> COUNT führt nicht zum Ergebnis

Code:
SELECT krid, SUM(IF(katid=3, '1', '0')) AS katid3counter FROM `temp` t1 WHERE katid3counter < 1 GROUP BY t1.krid
=> WHERE Ausdruck, katid3counter unknown column

Ohne dem katid3counter im where-Klause bin ich hier schon ganz nah an der Lösung. Doch die Alias-Ausgabe-Spalte darf nicht im where-Klause verwendet werden...

Code:
SELECT krid, SUM(IF(katid=3, '1', '0')) AS katid3counter FROM `temp` t1 WHERE SUM(IF(katid=3, '1', '0')) < 1 GROUP BY t1.krid
=> #1111 - Invalid use of group function

Vielleicht fällt Euch noch was ein?
Mit Zitat antworten
  #9 (permalink)  
Alt 09-09-2008, 06:47
treebeard
 Newbie
Links : Onlinestatus : treebeard ist offline
Registriert seit: Sep 2008
Beiträge: 5
treebeard ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Okay, bin nun zur Lösung vorgestossen. In der Having Klausel sind die Ausgabefelder abfragbar:

Code:
SELECT krid, SUM(IF(katid=3, '1', '0')) AS katid3counter FROM `temp` t1 GROUP BY t1.krid HAVING katid3counter < 1
Hätte niemals gedacht, dass es so kompliziert ist.
Falls jemand noch Ideen hat, den Ausdruck zu optimieren, gerne
Würde mich echt freuen, wenn Ihr noch Verbesserungen zu diesem Code habt.

Vielen Dank schon mal fürs "miträtseln".
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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.

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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:51 Uhr.