Tom
Tom

Reputation: 488

select multiple tables in single sql query

The other threads about this didn't seem to help me. I want to select all the information from one table, but order them by a value in another table.

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

Except I need to ORDER BY 'votes' DESC; which is in another table called m_votes.

Is it possible to do this? I have read on another website that this query is impossible.

$query="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) 
    ORDER  BY SUM(v.votes) DESC;"

^^This doesn't work

Upvotes: 0

Views: 4595

Answers (4)

Gurpreet Singh
Gurpreet Singh

Reputation: 109

Please try below query, you missed group by clause.

    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;

Upvotes: 0

Trinidad
Trinidad

Reputation: 2826

You have to join the data, that is, you need to have the votes for each guestbook message.

Let's suppose for simplicity you have the following tables:

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

and

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

Then you could do something like

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

or even better:

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

See:

Upvotes: 1

Mark Byers
Mark Byers

Reputation: 838896

You need a join:

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

Upvotes: 5

Tom
Tom

Reputation: 488

I'm a bit of a beginner and to me this is a very hard query as it needs to find the SUM of 'votes' in m_votes and order by that. As well as get the information from the other query. This is the query that gets the information about the message:

 "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";  

And this is the query that gets the information about the votes:

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

But I have no idea who I would put them into one query that will gather all the information from the first query, then ORDER them by votes.

Upvotes: 1

Related Questions