2

私はこの単純なコードの平和に頭を悩ませています。それは機能したくありません、そして私は他の解決策を考えることができません...

それを機能させるのを手伝っていただけませんか?

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

重要なのは、最初の選択からの「chart」列をサブクエリに渡してcharts.chart = chartに渡す必要があるということですが、代わりにサブクエリはそれ自体と比較されます。つまり、chart=chart-常にtrueです。

私はそれがそのように機能しないことを知っています...しかし、私は他の方法を本当に考えることができません。私がやろうとしていることへの道はありますか?

編集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を選択する必要があります。等々...

編集2:私は今、ある種のネガティブな結合を探しています。これでいいと思いますが、使い方がわかりません。その間、いくつかの研究をしています...

4

4 に答える 4

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で動作すると思います。

于 2012-04-10T12:14:35.427 に答える
1

試す:

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これは同等ですが、インデックスにも適しています。

于 2012-04-10T12:42:15.993 に答える
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;
于 2012-04-10T12:15:06.970 に答える
0

whereselect句を使用してフィルタリングできます。

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
    ) 
于 2017-02-26T10:22:22.123 に答える