2017-09-22 11 views
0

私は、選択したムービーのメタデータとデータベース内のメタデータを比較することで、類似のムービーを返すサイトを開発しています。sql IN句は、選択したものの代わりに現在の行を返すだけです

現時点では、の分類評価をと比較しています。あなたはRまたはMAの評価を持って映画を選択した場合たとえば、その後、結果は同様の分類で何かする必要があります返された(すなわち:MMAまたは)。

これまでのところ、これは私のSQLPHPがどのように見えるかです。

$rating = $data->rating; 
if($rating === "MA" || $rating === "R"){ 
    $rating = "M, MA, R"; 
} 

$rating = "rating IN (" . $rating . ")"; 
$sql = "SELECT * FROM movies WHERE unique_id <> ? AND " . $rating . " LIMIT 10"; 

SQLがページに出力された場合、それはそれがないている、SELECT * ... AND rating IN (M, MA, R) ...のようになります。しかし、代わりに返された結果がMMAまたはR(選択したムービーを含まない)の格付けを持つすべてのそれらの映画のあることの、それだけで選択したムービーを返します。それはmovieEから離れて、すべてのムービーを返すべきである、movieAについては

+----+--------+--------+-----------+ 
| id | title | rating | unique_id | 
+----+--------+--------+-----------+ 
| 1 | movieA | R  | idA  | 
| 2 | movieB | MA  | idB  | 
| 3 | movieC | M  | idC  | 
| 4 | movieD | MA  | idD  | 
| 5 | movieE | PG  | idE  | 
+----+--------+--------+-----------+ 

は、ここに私の現在のデータベーステーブルのです。 movieCの場合は、2, 4 and 5が返されます。

私はIN節を正しく使用したように感じます。なぜ、これが動作しないのか混乱しています。

すべての援助は高く評価されます、乾杯。

答えて

1

評価は文字列なので、引用符で囲む必要があります。

if($rating === "MA" || $rating === "R"){ 
    $rating = "'M', 'MA', 'R'"; 
} else { 
    $rating = "'$rating'"; 
} 

rating列がタイプvarcharである場合When to use single quotes, double quotes, and backticks in MySQL

+0

私は今テストします!ありがとう:) –

+0

3分で答えを受け入れる:)リファレンスbtwのおかげで –

1

を参照してください、あなたは検索文字列のそれぞれに単一引用符を囲むように持っています。

変更:へ

$rating = "M, MA, R"; 

$rating = "'M', 'MA', 'R'"; 

、そして得られたクエリは次のようになります。

SELECT * FROM movies 
WHERE unique_id <> ? 
    AND rating IN ('M', 'MA', 'R') 
LIMIT 10 

そして、それを適用し、あなたがする必要があります取得期待される結果。各要素間で

+0

彼はまた、彼が評価のリストを割り当てていないときに引用符を追加する必要があります。 – Barmar

+0

それが基本です。検索される列が文字列である限り、一重引用符を使用することは正しい結果には必須です。 –

0

あなたは文字列代わりの整数を使用している場合は、追加の引用符(')。たとえば:

IN(M, MA, R) 

は、代わりに、なる:

IN('M','MA','R') 
関連する問題