在某些列值

时间:2017-06-08 21:13:15

标签: mysql

我在MySQL数据库中有一个表让我们称之为产品:

id_product          |    id_lang            |           name
    654             |           1           |           abc
    654             |           2           |           xyz
    654             |           3           |           abc

    456             |           1           |           qwe
    456             |           2           |           rty
    456             |           3           |           zxc

    123             |           1           |           bnm
    123             |           2           |           bnm
    123             |           3           |           jkl

    789             |           1           |           ert
    789             |           2           |           tyu
    789             |           3           |           ert

    333             |           1           |           ddd
    333             |           2           |           o
    333             |           3           |           bbb

    222             |           1           |           xxx
    222             |           2           |           zzz
    222             |           3           |           o

我想找到所有在id_lang 1 3 中具有相同名称的id_product。因此,在这种情况下的结果应该是id_product:654和789.如果在此查询中也可以找到id_lang = 3和name =“o”的所有id_product,那将是很好的。所以结果应该是,id_product:654,789和222.但是如果它太复杂了我可以有两个查询并在php中合并两个数组。

2 个答案:

答案 0 :(得分:2)

您可以使用GROUP BYHAVINGUNION使用以下解决方案:

SELECT id_product 
FROM table_name 
WHERE id_lang IN (1, 3) 
GROUP BY id_product, name 
HAVING COUNT(name) > 1
UNION
SELECT id_product
FROM table_name
WHERE id_lang = 3 AND name = 'o'
  

演示: http://sqlfiddle.com/#!9/88da30/4/0

<强>解释
要获得第一个预期结果,您可以使用以下查询:

-- result of this query: 654 and 789
SELECT id_product 
FROM table_name 
WHERE id_lang IN (1, 3) 
GROUP BY id_product, name 
HAVING COUNT(name) > 1

要获得第二个结果,您可以使用以下查询:

-- result of this query: 222
SELECT id_product
FROM table_name
WHERE id_lang = 3 AND name = 'o'

要加入这两个结果,您必须使用UNION合并查询(请参阅上面的解决方案)。

答案 1 :(得分:2)

包括来自@Sebastian的查询的第一部分 并添加第二部分与联盟

SELECT 
    id_product
FROM
    table_name
WHERE
    id_lang IN (1 , 3)
GROUP BY id_product , name
HAVING COUNT(name) > 1    
UNION
SELECT 
    id_product
FROM
    table_name
WHERE
    id_lang = 3 AND name = 'o'