2012-08-08 35 views
0

我想使用SQLite來計算多對多關係(tag-tags-post)中表的一行的子集。我曾嘗試下面的SQL沒有運氣:限制多個表加入的內容

SELECT tag.*, count(post.id) 
FROM tag 
JOIN tags 
    ON tag.id = tags.tag_id 
JOIN post 
    ON post.id = tags.post_id 
    AND datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 

我曾嘗試移動條件爲WHERE條款但這改變不了什麼。沒有條件,結果如預期顯示。

編輯1

就OT是明確的,通過移除AND條件我得到的結果,儘管與post所有行,符合市場預期。此外,以下查詢

SELECT count(post.id) 
FROM post 
WHERE datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 

提供正確的結果。

EDIT 2

有沒有在標籤表中的數據錄入錯誤。該查詢現在工作正常。向所有人道歉。投票刪除。

+0

你不能做WHERE GROUP BY。我認爲這是一個錯字? – podiluska 2012-08-08 13:00:55

+0

確實,我已經刪除了那個。謝謝。 – NobRuked 2012-08-08 13:05:08

+0

@ypercube沒有返回結果。 – NobRuked 2012-08-08 14:22:28

回答

2

你有沒有嘗試過這樣的:

SELECT tag.id, tag.name, tag.description, tag.slug, count(post.id) 
FROM tag JOIN 
    tags 
    ON tag.id = tags.tag_id JOIN 
    post 
    ON post.id = tags.post_id AND 
     datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 

如果標籤有比組由四個以外的任何列中的原始SQL會產生一個錯誤。儘管如此,爲了得到你想要的,你需要:COUNT(DISTINCT post.id)。

檢查原來加入做右外正在連接,而不是連接:

SELECT tag.id, tag.name, tag.description, tag.slug, count(post.id) 
FROM tag right outer JOIN 
    tags 
    ON tag.id = tags.tag_id right outer JOIN 
    post 
    ON post.id = tags.post_id AND 
     datetime(post.published) < datetime('2012-08-08 12:42:41.696451') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 

如果你得到一個列,其中前四列是NULL,那麼你的ID不表之間的匹配。

+0

不幸的是,這沒有提供任何結果。 – NobRuked 2012-08-08 13:57:13

+0

此查詢使用原始查詢中設置的連接。據推測,從標籤到標籤或從標籤到發佈都存在問題。您可以嘗試外連接以查看這是否是問題。 – 2012-08-08 14:17:35

+0

Gordon使用'LEFT OUTER JOIN'提供了一個結果,雖然不正確(每個標記爲0行),表明'post'中沒有行符合我的條件。但是,按照我的編輯,實際上有符合條件的行。 – NobRuked 2012-08-08 14:24:25

2

你的日期精度太高了嗎?

即:做這項工作

SELECT tag.*, count(post.id) 
FROM tag 
JOIN tags 
    ON tag.id = tags.tag_id 
JOIN post 
    ON post.id = tags.post_id 
    AND datetime(post.published) < datetime('2012-08-08 12:42:41') 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name 
+0

不,空白結果。 – NobRuked 2012-08-08 13:57:32

+0

你有那些在這段時間之前發佈過標籤的帖子...? – podiluska 2012-08-08 13:58:44

+0

是的。所選列「post.published」僅僅是一個例子。試圖過濾'post'的行似乎每次都不會導致行。 – NobRuked 2012-08-08 14:04:13

1

也許有一些問題與鑄件。我不確定是否需要劇組DATETIME

與內試試這個聯接左聯接替換,這至少會顯示0計數的所有標籤,如果沒有後符合條件:

SELECT tag.*, COUNT(DISTINCT post.id) 
FROM tag 
    LEFT JOIN tags 
    ON tag.id = tags.tag_id 
    LEFT JOIN post 
    ON post.id = tags.post_id 
    AND post.published < '2012-08-08 12:42:41.696451' 
GROUP BY tag.id, tag.name, tag.description, tag.slug 
ORDER BY tag.name ; 

也嘗試用切碎的時間millseconds:'2012-08-08 12:42:41.696'或秒:'2012-08-08 12:42:41'

+0

事實上,這顯示了所有標記爲0的結果。但是,有__are__行符合條件,根據我對該問題的編輯。 – NobRuked 2012-08-08 14:25:08

+0

@nobRuked:看我的編輯。無論如何,你可以在3張桌子上發佈幾行(與節目相匹配)嗎? – 2012-08-08 14:27:33