Counting the occurrence of a record in MySQL - mysql

I want to display records that have more than one occurence, basing them off of a column.
For Example:
id user_id
------ --------
1 FA068
2 FA068
3 FA068
4 FA145
5 FA111
6 FA200
7 FA200
8 FA155
9 FA145
10 FA145
And I want this to be the output:
id user_id
------ --------
1 FA068
2 FA068
3 FA068
6 FA200
7 FA200
9 FA145
10 FA145
I want to display all the records of those that have more than one occurrence basing from the user_id column.
Please help. Thanks!

something like:
select * from my_table where user_id in
(select user_id from my_table group by user_id having count(user_id) > 1)

You can easily count records and use HAVING clause
SELECT `user_id`, COUNT(*) AS num
FROM `table`
GROUP BY user_id
HAVING num > 1

Related

Group By Multiple Columns Separately

I know that you can use the GROUP BY keyword to group by multiple columns, but here's what I'm trying to do:
Table: Codes
user_id day_of_week id
------------------------------
1 T 1
1 W 2
1 W 3
2 F 4
2 F 5
2 M 6
And I am trying to find a command to output to get this:
Table: Codes
user_id day_of_week count(*)
-------------------------------------
1 T 1
1 W 2
2 F 2
2 M 1
So as you can see, it's grouping by the day of the week and the user_id Can someone help me achieve this with MySQL?
You can use multiple columns in GROUP BY clause:
SELECT user_id, day_of_week, COUNT(*) AS cnt
FROM Codes
GROUP BY user_id, day_of_week

MySQL multiple count based on two column with multiple GROUP BY in single table

I have a query like below, it is working fine but not optimized, since it takes 1.5 sec to run. How to make this to an optimized result?
select h.keyword_id,
( select count(DISTINCT(user_id)) from history where category_id = 6
and h.keyword_id=keyword_id group by keyword_id ) as cat_6,
( select count(DISTINCT(user_id)) from history where category_id = 7
and h.keyword_id = keyword_id group by keyword_id ) as cat_7
from
history h group by h.keyword_id
History table
his_id keyword_id category_id user_id
1 1 6 12
2 1 6 12
3 1 7 12
4 1 7 12
5 2 6 13
6 2 6 13
7 2 7 13
8 3 6 13
Result:
keyword_id cat_6 cat_7
1 2 2 (unique users)
2 2 1
3 1 0
You can rewrite your query like this:
select h.keyword_id,
count(distinct if(category_id = 6, user_id, null)) as cat_6,
count(distinct if(category_id = 7, user_id, null)) as cat_7
from
history h
group by h.keyword_id
Your desired result based on the sample data is by the way false. In each keyword_id there's always just one distinct user_id.
you can see the query in action in an sqlfiddle here
For more optimization, you'd have to post the result of show create table history and the output of explain <your_query>;

mysql count and then group by that count

I have a table structured like this:
user_id saved_id
1 2
1 34
1 36
2 489
2 14
3 731
4 48
5 901
6 234
6 9
6 64
What I would like to do is first count how many saved ids each user has, and then group these results so that I know how often each total_saves occurs.
This is what I currently have:
SELECT user_id, count(*) as total_saves FROM table GROUP BY user_id ORDER BY total_saves DESC
Which gives me
user_id total_saves
1 3
6 3
2 2
3 1
4 1
5 1
What I would like to have is this:
total_saves count
3 2
2 1
1 3
Can't get my head around how to group the total_saves that I already have. I tried GROUP BY total_saves but that doesn't work.
Use two aggregations:
select total_saves, count(*) as cnt
from (select user_id, count(*) as total_saves
from t
group by user_id
) t
group by total_saves;
Use Subquery
select total_saves, count(total_saves) as count
from (select user_id, count(*) as total_saves
from table
group by user_id
) a
group by total_saves order by total_saves;

Joining Summary Tables in MYSQL

I have two tables that I would like to join in MYSQL and I'm looking for the most optimized way to do this. Here's the problem:
I want to count the number of records based on a field (call it customer) in each table then join the results together (using customer) to produce a summary table. Note that all customers must be returned even if one table does not include a customer
TABLE A
Customer
--------
1
1
4
4
5
6
and
TABLE B
Customer
--------
4
5
5
5
6
6
7
7
7
into a summary table
SUMMARY
Customer CountA CountB
-----------------------
1 2 0
4 2 1
5 1 3
6 1 2
7 0 3
Any ideas on how to do something like this?
SELECT customer,SUM(source = 'a') cnta, SUM(source = 'b') cntb FROM
(
SELECT 'a' source,customer FROM customer_a
UNION ALL
SELECT 'b',customer FROM customer_b
) n
GROUP
BY customer;

How can I get the max value within a max value in mysql?

I have a schema like the following
id (INT)
Cycle_Number (INT)
Cycle_Day (INT)
Date (date)
...other columns irrelevant to the question...
How can I get the row that has the max Cycle_Day within the max Cycle_Number
For example, say I have the following data
ID Cycle_Number Cycle_Day Date
1 1 1 2011-12-01
2 1 2 2011-12-02
3 2 1 2011-12-03
4 2 2 2011-12-04
5 2 3 2011-12-05
6 2 4 2011-12-06
7 3 1 2011-12-07
8 3 2 2011-12-08
9 3 3 2011-12-09
The query would return row 9. (It has the highest Cycle_Day within the highest Cycle_Number)
Thanks
this one is compatible MySql 5.5 with no joint tables
SELECT id
FROM cycles
ORDER BY Cycle_Number DESC , Cycle_Day DESC
LIMIT 0 , 1
Regards
This SQL query should provide the max value you want.
SELECT ID, Cycle_Number, Cycle_Day, Date
FROM yourTable AS t
CROSS JOIN (
SELECT MAX(Cycle_Number) AS Cycle_Number FROM yourTable
) AS sq USING (Cycle_Number)
ORDER BY Cycle_Day DESC LIMIT 1