2009-08-17 15 views
3

私は与えられたタグを持つ質問を検索しようとしています。SQLのWHERE条件として他のテーブルを使用するには

どのように次の問題を解決できますか?

テーブル

questions   |  tags 
-------------------|----------------- 
    question_id  |  tag 
    title   |  question_id 
    was_sent_at_time | 

私のコード

SELECT question_id, title 
    FROM questions 
    WHERE question_id IN 
    ( 
     SELECT question_id 
     FROM questions 
     ORDER BY was_sent_at_time  // problem here 
     DESC LIMIT 50 
    ) 
    AND tag IN       // problem here 
    (
     SELECT tag FROM tags 
     WHERE tag = $1 
     AND WHERE question_id IN (                    
      SELECT question_id 
      FROM questions 
      ORDER BY was_sent_at_time 
      DESC LIMIT 50 
     ) 
    ) 
    ORDER BY was_sent_at_time 
    DESC LIMIT 50; 

私は、明らかなJOINを使用する必要があります実行し、

Warning: pg_prepare() [function.pg-prepare]: Query failed: ERROR: syntax error at or near "WHERE" LINE 14: AND WHERE question_id IN (^ in /var/www/codes/handlers/searches/handle_questions_by_tag.php on line 30 

を取得します。 しかし、私は最終結果の出力としてタグを取得したくありません。

+0

ありがとうございました! –

答えて

3

試してみてください。

SELECT q.question_id, q.title 
    FROM questions  q 
     INNER JOIN tags t ON q.question_id=t.question_id 
    WHERE tag = $1 
    ORDER BY q.was_sent_at_time 
    DESC LIMIT 50 
1

JOINSは、あなたが最終結果にタグを取得することを意味しません。タグを表示したくない場合は、指定した列を同じにしておくことができます。

2

あなたは、単にこれをしたいように聞こえる:

SELECT questions.question_id, questions.title 
FROM questions 
WHERE EXISTS 
    (SELECT 1 
    FROM tags 
    WHERE tag = $1 AND tags.question_id = questions.question_id 
) 
ORDER BY was_sent_at_time DESC 
LIMIT 50; 

ます。また、そうのようなJOINを使用することができます。

SELECT questions.question_id, questions.title 
FROM questions 
INNER JOIN tags ON (tags.question_id = questions.question_id) 
GROUP BY questions.question_id 
ORDER BY was_sent_at_time DESC 
LIMIT 50; 

JOINを使用すること自体は何を得るの行や列を決定しません。適切なSQL句を追加することによってそれを決定します。

+0

最初のコードの4行目の1は何ですか? –

+0

すべての 'SELECT'ステートメントは* something *を選択する必要がありますが、そのサブクエリのフィールドは気にしません(つまり、' WHERE'節に一致する行が存在することに気を付けるだけです) MySQLは実際には使用しない列の取得を気にする必要はありません。 42や8347と同じように簡単にできます.1自体はどこにも使われていません。 – VoteyDisciple

0
select questions.* from questions, tags 
where questions.questionid = tags.questionid 
and tags.tag = $1 

しかし、私は(1つのタグは多くの質問に関連付けることができ、一つの質問は、多くのタグを持つことができます)質問とタグの間に多くの多くの関係を示唆しています。私はそれはそれを行うだろうと思い

0
SELECT questions.question_id, questions.title 
FROM questions 
INNER JOIN tags ON questions.question_id=tags.question_id 
WHERE tags.tag=$1 
ORDER BY questions.was_sent_at_time 
DESC LIMIT 50; 

...

0

方法について:私は実際には持っていないが、これは、出力のタグテーブルから何かを必要とすべきではない

SELECT questions.question_id, questions.title, questions.was_sent_at_time 
FROM questions 
JOIN tags ON questions.question_id = tags.question_id 
WHERE tags.tag = 'whatever' 
ORDER BY questions.was_sent_at_time 

これをテストしました。

関連する問題