0

I want to use IN a subquery in mysql but I need GROUP_CONCAT to have a having (my sub query work well).

SELECT pd.* FROM Product pd 
WHERE perimeter_id IN (SELECT GROUP_CONCAT(p.id) 
FROM Perimeter p 
GROUP BY p.network_id, p.productRange_id, p.country_id 
HAVING count(id) > 1);
1
  • 2
    Ok... Where is the question ? Commented Sep 8, 2015 at 14:10

2 Answers 2

1

You don't have to use GROUP_CONCAT. This query will return all (network_id, productRange_id, country_id) that have multiple IDs:

SELECT p.network_id, p.productRange_id, p.country_id, GROUP_CONCAT(p.id) 
FROM Perimeter p 
GROUP BY p.network_id, p.productRange_id, p.country_id 
HAVING count(id) > 1

This query will return all IDs in different rows:

SELECT p.ID
FROM
  Perimeter p INNER JOIN (
    SELECT p.network_id, p.productRange_id, p.country_id, GROUP_CONCAT(p.id) 
    FROM Perimeter p 
    GROUP BY p.network_id, p.productRange_id, p.country_id 
    HAVING count(id) > 1
  ) d ON (p.network_id, p.productRange_id, p.country_id) = (d.network_id, d.productRange_id, d.country_id)

and this is your final query:

SELECT pd.*
FROM Product pd 
WHERE
  perimeter_id IN (
SELECT p.ID
FROM
  Perimeter p INNER JOIN (
    SELECT p.network_id, p.productRange_id, p.country_id, GROUP_CONCAT(p.id) 
    FROM Perimeter p 
    GROUP BY p.network_id, p.productRange_id, p.country_id 
    HAVING count(id) > 1
  ) d ON (p.network_id, p.productRange_id, p.country_id) =
         (d.network_id, d.productRange_id, d.country_id)
)
Sign up to request clarification or add additional context in comments.

Comments

0

I think you can do a INNER JOIN like

SELECT pd.* 
FROM Product pd 
INNER JOIN Perimeter p ON pd.perimeter_id = p.id
GROUP BY p.network_id, p.productRange_id, p.country_id 
HAVING count(DISTINCT p.id) > 1;

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.