2011-02-21 86 views
0

關於此的其他線程似乎沒有幫助我。我想從一個表中選擇所有的信息,但是通過另一個表中的值來排序。在單個sql查詢中選擇多個表

SELECT消息,
date
IP,
名,
網站,
ID
FROM guestbook_message
WHERE刪除= 0
和日期> DATE_SUB(NOW(),INTERVAL 1天)
ORDER BY date DESC「;

除我需要ORDER BY 'votes' DESC;這是在另一個表中稱爲m_votes

可以做到這一點嗎?我在另一個網站上閱讀過這個查詢是不可能的。

$查詢=「SELECT g.message, g.date, g.ip, g.name, g.website, g.id FROM guestbook_message AS克 JOIN m_votes AS訴 ON g.id = v.vid WHERE g.deleted = 0 AND v.messageid = $中間 AND g.date> DATE_SUB(NOW(),INTERVAL 1 DAY) ORDER BY SUM(v.votes)DESC;」

^^這不起作用

+3

您需要一個連接或一個子查詢來引用查詢中的「投票」列,否則它將無法工作。 –

+0

請發佈兩個表('SHOW CREATE TABLE guestbook_message'和'SHOW CREATE TABLE m_votes')的表定義,以及它們如何相關(如果表定義中不明顯)的簡短描述。 –

回答

5

你需要一個連接:

SELECT 
    g.message, 
    g.date, 
    g.ip, 
    g.name, 
    g.website, 
    g.id 
FROM guestbook_message AS g 
LEFT JOIN m_votes AS v 
ON g.id = v.message_id 
WHERE g.deleted = 0 
AND g.date > NOW() - INTERVAL 1 DAY 
GROUP BY g.id 
ORDER BY COUNT(v.message_id) DESC 
+0

+1擊敗我! –

1

我有點初學者的,對我這是因爲它需要找到一個非常艱難查詢m_votes中「投票」的總數和順序。以及從其他查詢中獲取信息。 這是獲取有關消息的信息查詢:

"SELECT message, 
     `date`, 
     ip, 
     name, 
     website, 
     id 
    FROM `guestbook_message` 
    WHERE deleted = 0 
    AND date > DATE_SUB(NOW(), INTERVAL 1 DAY) 
    ORDER BY `date` DESC"; 

這是獲取有關票信息查詢:

"SELECT SUM(votes) as votes FROM m_votes WHERE messageid = $mid" 

但我不知道是誰,我會把他們整合到一個查詢中,該查詢將收集來自第一個查詢的所有信息,然後通過投票對它們進行排序。

+0

Mark的回答看起來非常好,但我不確定我是如何得到第二位qurey的。 – Tom

+1

這並不回答這個問題。你應該在你的問題中包含這些信息,而不是將其作爲答案發布。 –

+0

對不起,我現在編輯了我原來的帖子。 – Tom

1

您必須加入數據,也就是說,您需要爲每條留言信息投票。

讓我們假設爲簡單起見,您有以下表格:

Message 
---- 
id INT 
messsageText VARCHAR(5000) 

MessageVotes 
------------ 
messageId INT (references the `id` column in table Message) 
voteValue INT (suppose it can be +1 or -1, whatever) 
votingIp VARCHAR(100) 

然後,你可以做這樣的事情

SELECT 
    m.id, 
    m.messageText, 
    SUM(mv.voteValue) AS votes 
FROM 
    Message AS m, 
    MessageVotes AS mv 
WHERE 
    mv.messageId = m.id 
GROUP BY 
    m.id, m.messageText /* here you need to place every field you `select` from Message */ 
ORDER BY 
    SUM(mv.voteValue) DESC 

甚至更​​好:

SELECT 
    m.id, 
    m.messageText, 
    SUM(mv.voteValue) AS votes 
FROM 
    Message AS m 
    LEFT JOIN MessageVotes AS mv ON mv.messageId = m.id 
GROUP BY 
    m.id, m.messageText 
ORDER BY 
    SUM(mv.voteValue) DESC 

參見:

0

請嘗試以下查詢,您by子句錯過組。

SELECT g.message, 
     g.date, 
     g.ip, 
     g.name, 
     g.website, 
     g.id 
    FROM guestbook_message AS g 
    JOIN m_votes AS v ON g.id = v.vid 
    WHERE g.deleted = 0 
     AND v.messageid = $mid 
     AND g.date > DATE_SUB(NOW(), INTERVAL 1 DAY) 
    GROUP BY g.message, 
     g.date, 
     g.ip, 
     g.name, 
     g.website, 
     g.id 
    ORDER BY SUM(v.votes) DESC;