Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

Mysql select all companies when all groups are true

Posted on 2012-03-16
6
Medium Priority
?
252 Views
Last Modified: 2012-03-16
Hello,

I have the following 2 tables (I simplified it here):

Customer:
`cust_id` int(10) unsigned NOT NULL auto_increment
 `cust_name` varchar(100) default NULL

Customer_groups  -> a customer can belong to many groups at the same time
`cust_id` int(10) unsigned NOT NULL
`group_id` int(10) unsigned NOT NULL

I need to select those customers who belong to ALL the selected groups.

For example let's say that the Customer_groups would have:

cust_id                   group_id
1                                   1
1                                   2
2                                   1
2                                   2
2                                   3
3                                    3
3                                    4
4                                    12
5                                      1
5                                      2
5                                      3
5                                      9
6                                       9

I want to select only those customers who belongs to group 1, group 2 and group 3.

So the result would be: customer 2 and customer 5.

How can I make such a query?

Thank you
0
Comment
Question by:starhu
  • 4
6 Comments
 
LVL 10

Expert Comment

by:Mez4343
ID: 37730433
Based on your sample data the result would be Customers 1,2,3 and 5 since they belong to groups(1,2 or 3). I assume you only want the query result to return the Cust_id if the cust is in the list of groups, so added the distinct keyword. Try this


SELECT DISTINCT customer
FROM Customer a,  Customer_groups b
WHERE a.cust_id = b.cust_id
AND b.group_Id in (1,2,3)
0
 
LVL 61

Expert Comment

by:HainKurt
ID: 37730436
try this:

SELECT * 
FROM   customer 
WHERE  cust_id IN (SELECT cust_id 
                   FROM   customer_groups 
                   WHERE  group_id IN ( 1, 2, 3 ) 
                   GROUP  BY cust_id 
                   HAVING COUNT(1) = 3) 

Open in new window


if it works we can write a better performing query with joins instead of using "in"
0
 
LVL 61

Expert Comment

by:HainKurt
ID: 37730449
like this

SELECT c.* 
FROM   customer c 
       INNER JOIN (SELECT cust_id 
                   FROM   customer_groups 
                   WHERE  group_id IN ( 1, 2, 3 ) 
                   GROUP  BY cust_id 
                   HAVING COUNT(1) = 3) cg 
         ON cg.cust_id = cg.cust_id 

Open in new window

0
Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

 
LVL 61

Expert Comment

by:HainKurt
ID: 37730461
oops, my solutions are to find customers who belongs to ALL not ANY :)

just remove HAVING COUNT(1) = 3 from above query

SELECT c.* 
FROM   customer c 
       INNER JOIN (SELECT cust_id 
                   FROM   customer_groups 
                   WHERE  group_id IN ( 1, 2, 3 ) 
                   GROUP  BY cust_id) cg 
         ON cg.cust_id = cg.cust_id 

Open in new window


or

SELECT c.* 
FROM   customer c 
       INNER JOIN (SELECT unique cust_id 
                   FROM   customer_groups 
                   WHERE  group_id IN ( 1, 2, 3 )) cg 
         ON cg.cust_id = cg.cust_id 

Open in new window

0
 

Author Comment

by:starhu
ID: 37730506
This works :

SELECT c.* 
FROM   customer c 
       INNER JOIN (SELECT cust_id 
                   FROM   customer_groups 
                   WHERE  group_id IN ( 1, 2, 3 ) 
                   GROUP  BY cust_id 
                   HAVING COUNT(1) = 3) cg 
         ON cg.cust_id = cg.cust_id 
                                            

Open in new window


... but can you somehow transform the select in such a form:
SELECT c.*
FROM   customer c
 where ....

The  customer table is an editable data grid in a Windows application, and the commercial Mysql plugin behaves erratically when there is a join in the select (the internal update mechanism will try to update the other table as well).

Thank you in advance
0
 
LVL 61

Accepted Solution

by:
HainKurt earned 2000 total points
ID: 37730528
try

SELECT c.*
FROM   customer c  where cust_id in
(SELECT cust_id
                   FROM   customer_groups
                   WHERE  group_id IN ( 1, 2, 3 )
                   GROUP  BY cust_id
                   HAVING COUNT(1) = 3)

for "in ALL GROUPS" or

SELECT c.*
FROM   customer c  where cust_id in
(SELECT unique cust_id
                   FROM   customer_groups
                   WHERE  group_id IN ( 1, 2, 3 )
)

for "in ANY GROUPS"
0

Featured Post

Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this series, we will discuss common questions received as a database Solutions Engineer at Percona. In this role, we speak with a wide array of MySQL and MongoDB users responsible for both extremely large and complex environments to smaller singl…
In this blog post, we’ll look at how ClickHouse performs in a general analytical workload using the star schema benchmark test.
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
In this video, Percona Solutions Engineer Barrett Chambers discusses some of the basic syntax differences between MySQL and MongoDB. To learn more check out our webinar on MongoDB administration for MySQL DBA: https://www.percona.com/resources/we…
Suggested Courses
Course of the Month15 days, 17 hours left to enroll

580 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question