Reputation: 488
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
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
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
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
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