2009-08-17 5 views
1

Wie können Sie wählen question_id und tag s für eine Frage, wenn einer der Tags bekannt ist?SQL: Um alle Tags für eine Frage zu erhalten, wenn man bekannt ist

Ich baue eine Tag-Suche, die Fragen nach einem Tag sucht, so dass das Ergebnis die Frage und ihre Tags anzeigt, einschließlich des Tags, das bei der Suche verwendet wurde.

Ich benutze die gleichen Tabellen wie in this question. Sie sind

Tabellen

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

Die Abfrage

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

Das Problem bei dieser Abfrage ist, dass es keine anderen Tags auf die Frage zugeordnet ist zeigen. Es kann möglich sein, die Frage-ID und Tags zu erhalten, wenn ein bestimmtes Tag existiert.

+0

Vielen Dank für Ihre Antworten! –

Antwort

1
SELECT TOP 50 q.question_id, q.title, t.tag 
    FROM tags t 
    INNER JOIN questions q 
    ON t.question_id = q.question_id 
    WHERE q.question_id IN 
    ( 
     SELECT tin.question_id 
     FROM tags tin 
     WHERE tin.tag = $1 
    ) 
    ORDER BY q.was_sent_at_time DESC 
tun müssen

Das beantwortet Ihre Frage (wenn ich es richtig verstanden habe), aber ich denke, Sie werden zu viele doppelte Daten haben - Sie wollen nicht wirklich, dass der Fragetitel für jeden Tag wiederholt wird. So sollten Sie es brechen in zwei Ergebnismengen:

SELECT TOP 50 q.question_id, q.title 
    FROM questions q 
    WHERE q.question_id IN 
    ( 
     SELECT tin.question_id 
     FROM tags tin 
     WHERE tin.tag = $1 
    ) 
    ORDER BY q.was_sent_at_time DESC 

und:

SELECT t.question_id, t.tag 
    FROM tags t 
    WHERE t.question_id IN 
    ( 
     /* 
     SAME SQL AS ABOVE WITH SELECT q.question_id, 
     OR SELECT FROM A TEMP TABLE THAT ABOVE WAS SAVED TO 
     */ 
    ) 
    ORDER BY t.question_id 

Dann, wenn Sie Ihre Seite bauen oder was auch immer, würden Sie sie zusammenbringen.

+0

** Was ist der Zweck der Wörter 'TOP 50' in Ihrer 'SELECT'-Abfrage? ** –

+0

Es ist das gleiche wie Limit 50 in SQL Server. –

+1

Ich bin mir ziemlich sicher, dass es umgekehrt ist: Limit ist pgsql, top ist mssql. – Kev

1

Sie sollten in der Lage sein, diese Arbeit in der Datenbank zu tun. Sie möchten es nicht in der Anwendungsschicht tun.

 
ID | Questions 
---|---------- 
1 | How much does a duck weigh? 
2 | What is your gender? 
3 | What is your ducks gender? 

Question ID | Tags 
------------|------- 
1   | Duck 
2   | Gender 
3   | Duck 
4   | Gender 

Beachten Sie, dass Variablennamen sind aufgrund Ihrer Schema-Design dupliziert

So alle Fragen rund um Enten zu bekommen (Frage 1 und 3), würden Sie

SELECT * from tags t 
INNER JOIN questions q on t.question_id = q.question_id 
WHERE 
t.tag = 'Duck' 
ORDER BY was_sent_at_time 
DESC LIMIT 50 
+0

Ihr doppelter Code hat mich verwirrt. Es ist jetzt klar. –