3 Stimmen

So verwenden Sie eine andere Tabelle als WHERE-Kriterium in SQL

Ich versuche, Fragen zu suchen, die ein bestimmtes Tag haben.

Wie können Sie das folgende Problem lösen?

Tische

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

Mein Code

    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;

Ich laufe und hole

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

Ich sollte offenbar JOINs verwenden. Ich möchte jedoch keine Tags als Ausgabe für mein Endergebnis erhalten.

3voto

KM. Punkte 98297

Versuchen:

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

2voto

VoteyDisciple Punkte 36203

Es klingt, als ob Sie das einfach wollen:

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;

Sie können auch eine JOIN etwa so:

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;

Mit einer JOIN bestimmt nicht selbst, welche Zeilen oder Spalten Sie erhalten. Das bestimmen Sie, indem Sie die entsprechenden SQL-Klauseln hinzufügen.

1voto

jamesaharvey Punkte 13583

JOINS bedeutet nicht, dass Sie in Ihrem Endergebnis Tags erhalten werden. Sie können die angegebenen Spalten beibehalten, wenn Sie keine Tags sehen wollen.

0voto

Cătălin Pitiș Punkte 13785
select questions.* from questions, tags
where questions.questionid = tags.questionid
and tags.tag = $1

Ich schlage jedoch eine Beziehung zwischen vielen Fragen und Tags vor (eine Frage kann viele Tags haben, ein Tag kann mit vielen Fragen verbunden sein).

0voto

Jonathan Punkte 12856
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;

Ich denke, das wird reichen...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X