0

画像の評価アプリを設定しようとしています。現在ログインしているユーザーによって評価されていない画像を表示したい。

これは2つのテーブルをカバーし、テーブルを正常に結合しましたが、追加の条件は次のとおりです。

  1. 画像である必要があります
  2. 現在のユーザーによってすでに評価されている画像が機能していない場合は除外します。

2つのAND条件がまったくないかのように結果を表示しています。

SELECT 
   ver_data_media.id, ver_data_media.value, ver_data_media.ref, 
   ver_data_media.type, ver_data_rating.a
FROM 
   ver_data_media
LEFT JOIN 
   ver_data_rating ON ver_data_media.ref = ver_data_rating.a
                   AND ver_data_media.type = 'image'
                   AND ver_data_rating.a != $current_user->ID

フランクに感謝します。

4

2 に答える 2

2

次のことを試してみてください。現在のユーザーのレコードを選択し、評価がnull/空の画像を表示します...おそらく。より効果的な答えを得るために、テーブルスキーマを表示しておいた方がよいでしょう。

SELECT ver_data_media.id, ver_data_media.value, 
ver_data_media.ref, ver_data_media.type, ver_data_rating.a
FROM ver_data_media
LEFT JOIN ver_data_rating
ON ver_data_media.ref = ver_data_rating.a
WHERE ver_data_media.type = 'image'
AND ver_data_rating.a is null
AND id = $current_user -- shouldn't this be like userid = $current_user, 
                        -- where is this ID coming from? what is its relation to this table?

それ以外の場合、最も可能性のある問題は、この行で検証しているデータが同じタイプではないことです。最善の提案は、 1つのデータ型をとの両方にキャストver_data_rating.a != $current_user->IDすることだと思います。ver_Data_rating.a$current_user

たとえば、次のいずれかを使用してテストできます。

  • CAST(ver_data_rating.a AS INT) != CAST($current_user as INT)

  • CAST(ver_data_rating.a AS INT) <> = CAST($current_user as INT)


更新:推奨テーブルスキーマとサンプルクエリを使用

クエリの接続方法、関係には実際に問題があるようです。このサンプルをご覧になり、結果をお知らせください。特定のユーザー/ユーザーのメディアテーブルから未評価 をオンラインで取得する2つの方法をリストしました。media records変数は、ユーザーIDを格納するために使用されます。

SQLFIDDLEデモンストレーション

サンプルデータ:

-- media table
ID  VALUE   REF     TYPE
1   300     15      image
2   100     25      art
3   500     35      cartoon
4   200     35      image
5   100     25      image
6   200     15      image
7   400     15      image
8   250     15      image
9   500     15      image
10  180     15      art

-- rating table
RID     MID     UID     SOMETHING
100     1       15      xyz
101     2       25      abc
102     5       25      efg
103     3       35      abc

ステップバイステップのクエリ:

set @user_id:=15;

-- find all media records for @user, type image
select * from media
where ref = @user_id
and type = 'image'
;

-- find all rated reords for @user
select mid from rating
 where uid = @user_id
;

-- media records that needs to be rated by @user
-- using IN clause
select * from media
where id not in 
(select mid from rating
 where uid = @user_id)
and type = 'image'
and ref = @user_id
;

-- media records that needs to be rated by @user
-- using INNER JOIN
select m.*
from media m
inner join (
select mid from rating
 where uid = @user_id) as x
on m.id <> x.mid
and m.type = 'image'
and m.ref = @user_id
;

上記の各ステップバイステップクエリの結果:

ID  VALUE   REF     TYPE
1   300     15      image
6   200     15      image
7   400     15      image
8   250     15      image
9   500     15      image

ユーザー=15、タイプ=画像の下の評価テーブルからの評価されたレコードID

MID
1

IN句の使用:ユーザー= 15、タイプ=image`の未評価のメディアレコード

ID  VALUE   REF     TYPE
6   200     15      image
7   400     15      image
8   250     15      image
9   500     15      image

INNER JOINの使用:ユーザー= 15、タイプ=画像の未評価のメディアレコード

ID  VALUE   REF     TYPE
6   200     15      image
7   400     15      image
8   250     15      image
9   500     15      image
于 2012-12-15T16:41:14.130 に答える
0

左結合は基本的に左外側結合の略です。追加のフィルターをJOIN条件の外でWHERE句に分離する必要があります。あなたのクエリは、ver_data_mediaからすべてのレコードを取得すると言っています。それと一緒に、私の条件に一致するver_data_ratingsを指定するか、そうでない場合はver_data_ratingsを指定しないでください。英語に翻訳するのは難しいです:)また、比較している列が正しくないか、名前を変更する必要があると思います。

これを試して...

SELECT ver_data_media.id, ver_data_media.value, ver_data_media.ref, ver_data_media.type, ver_data_rating.a
FROM ver_data_media
LEFT OUTER JOIN ver_data_rating
ON ver_data_media.id= ver_data_rating.media_id
WHERE ver_data_media.type = 'image'
AND ver_data_rating.user_id <> $current_user->ID
于 2012-12-15T16:45:56.860 に答える