2016-04-24 5 views
0

So habe ich eine Tabelle von "Artikeln", die einen Fremdschlüssel von "category_id" hat.Wie erhalten Sie alle Zeilen aus einer Datenbank, in denen der Fremdschlüssel dem Ergebnis einer Abfrage entspricht?

Artikel

| id | title | pub_date | category_id | 
----------------------------------- 
| 0 | abc | 23423443 | 1  | 
| 1 | def | 23423423 | 2  | 
| 2 | ghi | 24234234 | 1  | 
| 3 | jkl | 23423424 | 3  | 
| 4 | mop | 23432435 | 2  | 

Kategorien

| id | title | 
---------------- 
| 1 | News | 
| 2 | Feature | 
| 3 | Review | 

Ich habe den Titel einer Kategorie.

Ich möchte in einer Abfrage die ID der genannten Kategorie ermitteln und sie verwenden, um Artikel zurückzugeben, bei denen category_id = id und Veröffentlichungsdatum kleiner als die aktuelle Datumszeit ist.

Ist das möglich?

Ich benutze Postgres, aber ich betrachte das von einem akademischen Standpunkt, so dass Antworten in jedem SQL-Dialekt in Ordnung sein würde, da ich glücklich bin, die Übersetzung selbst für die Ausbildung zu machen.

Antwort

0

es ist nur ein einfaches beitreten

SELECT A.id,A.title,A.pub_date,A.category_id, 
     C.title 
FROM Articles A 
INNER JOIN Categories C 
ON A.category_id = C.id 
WHERE pub_date < NOW() 
    AND C.title = "your title" 
+0

Ich fügte die zusätzliche WHERE-Klausel für den spezifischen Kategorietitel hinzu, aber dies half mir, zu der Antwort zu kommen, die ich brauchte, danke. –

+0

dort habe ich meine Abfrage aktualisiert, um diese Tatsache zu zeigen, dass Sie nach einem bestimmten Kategorietitel suchen. Ich glaube nicht, dass ich dich in deiner Frage erwähnt habe. aber ja –

1
select * 
    from Articles 
    where pub_date <= now() and 
     category_id = (select id from Categories where title="TITLE") 
+0

Dieses sehr geholfen, landete ich den JOIN Weg zu gehen, anstatt Abfrage sub aber danke für deine Antwort. –

+0

ok. Ich denke @BobSalmon Antwort ist besser unter Join-Varianten, weil die WHERE-Klausel 'title = CATEGORY TITLE' die temporäre Tabelle reduzieren und so die Zeit der Ausführung – splash58

+0

Ob eine Unterabfrage (wie in dieser Antwort) oder Join ist besser, die Antwort ist: es kommt darauf an (http://stackoverflow.com/questions/2577174/join-vs-sub-query). Diese Antwort ist ein bisschen alt, aber ich denke immer noch relevant. Es lohnt sich zu wissen, wie man beides macht, also können Sie das verwenden, was in Ihrer Situation am besten funktioniert (was variieren kann). –

1

versuchen Ist dies die Art der Sache, nachdem Sie sind? Ich weiß nicht, ob das PostgresSQL ist oder nicht.

select A.id, A.title, A.pub_date, C.id, C.title 
from Articles A join Categories C on A.category_id=C.id 
where C.title = MY_CATEGORY_TITLE and 
a.pub_date < CURRENT_DATE_TIME 

ich die Notwendigkeit für Indizes bin ignorieren, Bestellungen usw.

+0

Das hat perfekt funktioniert, Tin Tran ist erst da angekommen. Vielen Dank. –

+1

Kein Problem. Wenn Sie es noch nicht getan haben, lohnt es sich, die verschiedenen Verbindungsarten (innen, außen, links und rechts) zu lesen. Ich war schlampig und habe nicht angegeben (vorausgesetzt, es würde standardmäßig auf inner). Tin Tran hat auch innere verwendet - ich denke, das ist, was Sie hier brauchen - aber es ist nützlich, auch über die anderen Arten zu wissen. –

+0

Ich habe schon ein wenig nachgeschaut, aber ich kann jetzt sehen, dass ich noch viel zu lernen habe. Den Weg durch das Problem mit allen möglichen Join-Varianten zu finden, ist an sich schon ein Hirngespinst. Vielleicht lohnt es sich, meine DB zu klonen und mit einigen von ihnen zu spielen. Danke noch einmal. –