2012-04-10 3 views
2

Я сломав голову над этим простым душевным кода, который не хочет работать, и я не могу думать любого другого решения ...MYSQL подвыборки в котором положение

Не могли бы вы, пожалуйста, помогите заставить его работать?

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; 

Есть 3 таблицы, связанные со следующими столбцами:

chart(
chart int(5) 
); 

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

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

Дело в том, что колонка «диаграмма» от первого выбора должны быть переданы в подзапрос charts.chart = график, но вместо того, чтобы подзапрос заканчивается сравнением с самим собой, т.е. chart = chart - всегда true.

Я знаю, что это не будет работать ... но я не могу думать ни о каком другом пути. Есть ли какой-нибудь способ для того, что я пытаюсь сделать?

EDIT 1: В принципе мне нужен обратный выбор:

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'; 

Этот запрос возвращает диаграммы, помеченные пользователем с заданным IP, например: 1, 4,5, 9. Но мне нужно выберите те, которые не помечены, а именно: 2,3,6,7,8,10 и так далее ...

EDIT 2: Я ищу какое-то отрицательное соединение сейчас. Я думаю, что это будет сделано, но я не знаю, как его использовать. Между тем делать некоторые исследования ...

+0

Так ...... Любые идеи? Я не знаю, на этот раз ... – Anonymous

ответ

1

Try:

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 

Обратите внимание, что вместо INET_NTOA(user_ip)='127.0.0.1' это гораздо лучше использовать

user_ip = 2130706433 который эквивалентный, но также удобный для индексирования.

+0

Вау, я бы никогда не подумал это и я не понимаю, что делает _localhost, но это работает! :) Спасибо! Я использую INET_NTOA хотя, потому что istead 127.0.0.1 должен быть '$ _server [' remote_addr ']'. – Anonymous

+0

Это просто псевдоним для подзапроса в скобках. Если это не просто localhost ip, но все еще постоянный для запроса, используйте 'user_ip = INET_ATON ($ server ['remote_addr']) условие. – piotrm

+0

oke, это выглядит лучше :) – Anonymous

1

Вы пытались использовать псевдонимы?

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;

Я не знаю, работает ли он в MYSQL, но я думаю, что это будет работать в MSSQL и Oracle.

+0

Ну, я пробовал псевдонимы, но он говорит неизвестный столбец ... в основном он проверяет предложение where, прежде чем он что-то выбирает, поэтому он не может его увидеть. – Anonymous

0

Я предполагаю, что это проблема присвоения имен ... Попробуйте сделать это:

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

Да, я тоже подумал об этом, но он говорит: ERROR 1054 (42S22): Неизвестный столбец c.chart в разделе «on», поэтому он не будет работать так ... :( – Anonymous

0

можно фильтровать с помощью которых выберите пункт:

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 
    )