Reputation: 2462
I have two table data and user. I need to get count of data->value and show only greatest count and user->name.
I tried some query but it's wrong.
SELECT data.value, user.name, data.field, COUNT(*) as count
FROM data
INNER JOIN user
ON data.value = user.id
GROUP BY user.name
HAVING data.field = 'user_id'
ORDER BY count DESC
LIMIT 0,1
DATA
id order_id field value
1 1 user_id 1
2 2 user_id 1
3 3 vehicle_id 1
4 4 user_id 1
5 5 vehicle_id 2
6 6 user_id 2
USER
id name
1 foo
2 joo
3 peter
Current result is
value name field count
1 foo user_id 4
expecting result is
value name field count
1 foo user_id 3
Upvotes: 0
Views: 177
Reputation: 74018
You must group not only by user.name, but also by data.field and data.value, then you will get the desired result, see (sqlfiddle)
SELECT data.value, user.name, data.field, COUNT(*) as count
FROM data
INNER JOIN user ON data.value = user.id
GROUP BY data.value, user.name, data.field
HAVING data.field = 'user_id'
ORDER BY count DESC
LIMIT 0,1
Upvotes: 1
Reputation: 204746
Use where
instead of having
.
With where
you filter the data. But using having
takes all records and filter out complete groups and not single records
SELECT data.value, user.name, data.field, COUNT(*) as count
FROM data
INNER JOIN user ON data.value = user.id
WHERE data.field = 'user_id'
GROUP BY data.value, user.name, data.field
ORDER BY count DESC
LIMIT 0,1
Upvotes: 1
Reputation: 133360
You should add filter ond data.field also
SELECT data.value, user.name, data.field, COUNT(*) as count
FROM data
INNER JOIN user
ON data.value = user.id and data.field = 'user_id'
GROUP BY user.name
ORDER BY count DESC
LIMIT 0,1
Upvotes: 0