2012-04-10 9 views
2

ich breche meinen Kopf auf diesem einfachen Frieden des Codes, die nicht arbeiten wollen, und ich kann von jeder anderen Lösung nicht denken ...MYSQL Subselect in where-Klausel

Könnten Sie bitte helfen damit es funktioniert?

SELECT chart FROM chart WHERE (select count(user_id) FROM users join charts ON 
user_id=charts.UID and charts.chart=chart WHERE INET_NTOA(user_ip)='127.0.0.1')=0; 

Es gibt drei Tabellen mit den folgenden Spalten beteiligt: ​​

chart(
chart int(5) 
); 

charts(
UID int(11), 
chart int(5) 
); 

`users` (
`user_id` int(11), 
`user_ip` int(10) 
); 

Der Punkt ist, dass die ‚Chart‘ Spalte von der ersten sollten wählen geführt werden, um Unterabfrage = Diagramm charts.chart, sondern die Unterabfrage endet mit sich selbst zu vergleichen, dh Diagramm = Diagramm - immer wahr.

Ich weiß, dass es nicht so funktioniert ... aber ich kann wirklich nicht anders denken. Gibt es überhaupt einen Weg zu dem, was ich versuche zu tun?

EDIT 1: Grundsätzlich muss ich eine umgekehrte Auswahl:

select chart.chart from chart join charts on chart.chart=charts.chart join users 
    on user_id=charts.UID and INET_NTOA(user_ip)='127.0.0.1'; 

Diese Abfrage gibt Diagramme, die vom Benutzer mit bestimmten IP-markiert sind, zB: 1, 4,5, 9. Aber ich muss Wählen Sie die, die nicht getaggt sind, also: 2,3,6,7,8,10 und so weiter ...

EDIT 2: Ich bin auf der Suche nach einer Art von negativen Beitritt jetzt. Ich denke, das würde reichen, aber ich weiß nicht, wie ich es benutzen soll. Währenddessen machen Sie ein paar Recherchen ...

+0

So ...... Irgendwelche Ideen? Ich bin an dieser Stelle ahnungslos ... – Anonymous

Antwort

1

Versuchen:

SELECT c.chart FROM chart c 
LEFT JOIN 
(SELECT cn.chart FROM chart cn 
    JOIN charts cs ON cn.chart = cs.chart 
    JOIN users u ON u.user_id = cs.UID 
    WHERE user_ip = 2130706433) charts_localhost 
ON c.chart = charts_localhost.chart 
WHERE charts_localhost.chart IS NULL 

Beachten Sie, dass statt INET_NTOA(user_ip)='127.0.0.1' es viel besser ist

zu verwenden

user_ip = 2130706433 das ist gleichwertig aber auch indexfreundlich.

+0

Wow, ich würde nie denken ich verstehe auch nicht, was _localhost tut! Aber es funktioniert! :) Danke! Ich benutze zwar INET_NTOA, aber statt 127.0.0.1 sollte '$ _server [' remote_addr ']' sein. – Anonymous

+0

Es ist nur ein Alias ​​für eine Unterabfrage in Klammern. Wenn es nicht nur localhost ip ist, sondern immer noch für die Abfrage, benutze 'user_ip = INET_ATON ($ server ['remote_addr'])' Bedingung. – piotrm

+0

oke, das sieht besser aus :) – Anonymous

1

Haben Sie versucht, Aliase zu verwenden?

select a.chart from chart a where (select count(user_id) from users join charts on user_id=charts.UID and charts.chart=a.chart where INET_NTOA(user_ip)='127.0.0.1')=0;

Ich weiß nicht, ob es in MYSQL funktioniert, aber ich denke, es wäre in MSSQL und Oracle zu arbeiten.

+0

Nun versuchte ich Aliase, aber es sagt unbekannte Spalte ... im Grunde überprüft es die Where-Klausel, bevor es nichts auswählt, so dass es nicht sehen kann. – Anonymous

0

Ich denke, es ist ein Namens Problem ... Versuchen Sie dies zu tun:

SELECT c.chart FROM chart c 
WHERE (
    SELECT COUNT(u.user_id) FROM users u 
    INNER JOIN charts ch 
    ON u.user_id = ch.UID 
    AND ch.chart = c.chart 
    WHERE INET_NTOA(user_ip)='127.0.0.1' 
     ) = 0; 
+0

ja dachte ich auch, aber es heißt: FEHLER 1054 (42S22): Unbekannte Spalte 'c.chart' in 'on Klausel', so wird es nicht so funktionieren ... :( – Anonymous

0

Sie filtern können, wo select-Klausel:

SELECT TS.*, T.* 
FROM tbl_teams as T 
LEFT JOIN tbl_teamstats TS 
    ON TS.tbl_teams_id = T.id 
WHERE 
TS.id = (
     SELECT TS.id FROM tbl_teamstats TS 
     WHERE TS.tbl_teams_id = T.id 
     ORDER BY TS.id DESC 
     LIMIT 1 
    ) 
Verwandte Themen