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

05-12-2005, 16:19
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
user daten per join abfragen und gleichzeitig black/whitelist abfragen?
Hallo,
derzeit frage ich User wir folgt ab:
SELECT user.id, profil.name
FROM user
LEFT JOIN profil
ON user.id = profil.userID
WHERE
(user.privat = '2' && user.plzAusschluss != '".substr($_SESSION['plz'],0,1)."')
LIMIT 0,1
Jetzt möchte ich in diese Abfrage noch meine white- bzw. blacklist
einbinden, OHNE zuvor eine weitere Abfrage zu starten, geht das?
Whitelist:
userID, ownerID
userID = der user, der den user mit id = ownerID dennoch 'selecten' darf, obwohl er dies aufgrund
(user.privat = '2' && user.plzAusschluss != '".substr($_SESSION['plz'],0,1)."')
nicht könnte.
blacklist:
userID, ownerID
userID = der user, der den user mit id = ownerID nicht 'selecten' darf, obwohl er dies normallerweise könnte =>
(user.privat = '2' && user.plzAusschluss != '".substr($_SESSION['plz'],0,1)."')
Ich hoffe, ich habe mich einigermassen versändlich ausgedrückt?!
|

05-12-2005, 21:20
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
anders gefragt...
anders gefragt...
wenn die blacklist Tabelle so ausschaut:
userID, ownerID
2 1
1 2
3 2
...
und die user Tabelle so:
id, name
1 lars
2 michael
3 julia
4 anne
...
wie kann ich mit einer mit einer Query für user #1(Lars) alle Datensätze raussuche, die Lars nicht in Ihrer Blacklist haben?
Also in dem Beispiel alle user ausser #2 (michael), da er ja user #1 in seiner blacklist hat.
|

05-12-2005, 21:36
|
|
asp2php
Banned
|
|
Registriert seit: Feb 2004
Beiträge: 11.746
|
|
left join und mit is null den ownerId prüfen sollte dir helfen
|

05-12-2005, 21:50
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
SELECT user.id, user.email
FROM user
LEFT JOIN blacklist ON blacklist.userID = user.id
WHERE blacklist.userID IS NULL
oder
SELECT user.id, user.email
FROM user
LEFT JOIN blacklist ON blacklist.ownerID = user.id
WHERE blacklist.userID IS NULL
kapier das grad nich so...
Im ersten Fall kanns ja sein, dass ein anderer User ihn auf seine Blacklist gesetzt hat, und im zweiten Fall, dass dann einfach eine
andere userID gefunden wird ... ?!?
|

05-12-2005, 22:13
|
|
asp2php
Banned
|
|
Registriert seit: Feb 2004
Beiträge: 11.746
|
|
hm ... probier mal so: (ungetestet)
PHP-Code:
select c.id, c.email from
user a left join blacklist b on a.id=b.userid and a.id=1
right join user c on b.ownerid=c.id
where b.ownerid is null and c.id<>1
man kann wahrscheinlich noch optimieren, aber ich bin jetzt zu faul zu testen
Geändert von asp2php (06-12-2005 um 00:08 Uhr)
|

06-12-2005, 00:06
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
ich versteh das mit a.lid bzw. c.lid nicht, was bedeutet das?
|

06-12-2005, 00:08
|
|
asp2php
Banned
|
|
Registriert seit: Feb 2004
Beiträge: 11.746
|
|
vertipper von mir, ich verwende immer lid (l für long)  , daher ...
|

06-12-2005, 00:47
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
ah ok, dank Dir...
|

06-12-2005, 15:01
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
So hab ich's jetzt:
PHP-Code:
$userQuery = "SELECT u.id
FROM user u left join blacklist b on u.id = b.userID and u.id=1
right join user u2 on b.ownerID = u2.id
where b.ownerID is null and u2.id <> 1";
$userRes = mysql_query($userQuery) or die($userQuery.'<br><br>'.mysql_error());
while($userRow = mysql_fetch_array($userRes))
{
echo $userRow['id'].', '.$userRow['email'].'<br>';
}
Tabellen:
PHP-Code:
CREATE TABLE `blacklist` (
`userID` int(11) NOT NULL default '0',
`ownerID` int(11) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
CREATE TABLE `user` (
`id` mediumint(8) NOT NULL auto_increment,
`name` varchar(30) collate latin1_general_ci NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
INSERT INTO `user` VALUES (1, 'lars');
INSERT INTO `user` VALUES (2, 'michael');
INSERT INTO `user` VALUES (3, 'julia');
INSERT INTO `user` VALUES (4, 'anne');
und das kommt raus:
PHP-Code:
1,
1,
1,
2,
2,
2,
3,
3,
3,
4,
4,
4,
Mit
PHP-Code:
INSERT INTO blacklist VALUES (1, 2);
kommt das raus:
PHP-Code:
1,
1,
2,
2,
2,
3,
3,
3,
4,
4,
4,
Geändert von westberlin (06-12-2005 um 15:04 Uhr)
|

06-12-2005, 15:49
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
So funktioniert es jetzt soweit ich's testen konnte:
SELECT u.id, u.name
FROM user u left join blacklist b on u.id = b.ownerID AND b.userID=1
WHERE b.userID is null
AND u.id != 1
Ist an der Query was auszusetzen bzw. kann man da was optimieren? Oder ist sonst irgendnen Denkfehler drin?
Freu über mich über Feedback...
|

07-12-2005, 16:32
|
|
westberlin
Member
|
|
Registriert seit: Dec 2002
Ort: bln / fhain
Beiträge: 336
|
|
kann sich dem nochmal jmd annehmen?
Weiß überhaupt nicht, ob das gut gelöst ist so...
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|