Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 连接两个表并按公共列分组_Mysql - Fatal编程技术网

Mysql 连接两个表并按公共列分组

Mysql 连接两个表并按公共列分组,mysql,Mysql,我是MYSQL新手,正在努力形成一个连接两个表并返回唯一产品行的查询 表产品: ╔══════════════════════════════╦══════════╦════════════╦════════════════════╗ ║ ref ║ brand ║ mpn ║ sku ║ ╠══════════════════════════════╬══════════╬═══════════

我是MYSQL新手,正在努力形成一个连接两个表并返回唯一产品行的查询

产品

╔══════════════════════════════╦══════════╦════════════╦════════════════════╗
║             ref              ║  brand   ║    mpn     ║        sku         ║
╠══════════════════════════════╬══════════╬════════════╬════════════════════╣
║ 0001___DOGICLON___912-101242 ║ DOGICLON ║ 912-101242 ║ 000000000001082649 ║
║ 0002___DOGICLON___912-101242 ║ DOGICLON ║ 912-101242 ║ 912-101242         ║
║ 0003___Dogiclon___912-101242 ║ Dogiclon ║ 912-101242 ║ 912-101242(R400)   ║
║ 0005___Dogiclon___912-101242 ║ Dogiclon ║ 912-101242 ║ MILT-R400          ║
╚══════════════════════════════╩══════════╩════════════╩════════════════════╝
表格
存货

╔══════════════════════════════╦═══════╦═════════╦══════════╗
║             ref              ║ scost ║ instock ║ location ║
╠══════════════════════════════╬═══════╬═════════╬══════════╣
║ 0001___DOGICLON___912-101242 ║ 53.68 ║      24 ║ WA       ║
║ 0001___DOGICLON___912-101242 ║ 53.68 ║       0 ║ CA       ║
║ 0002___DOGICLON___912-101242 ║ 61.00 ║     121 ║ WA       ║
║ 0003___Dogiclon___912-101242 ║ 53.53 ║     100 ║ WA       ║
║ 0003___Dogiclon___912-101242 ║ 53.53 ║       0 ║ NY       ║
║ 0003___Dogiclon___912-101242 ║ 53.53 ║      20 ║ MA       ║
║ 0003___Dogiclon___912-101242 ║ 53.53 ║       2 ║ CA       ║
║ 0005___Dogiclon___912-101242 ║ 56.00 ║       5 ║ IN       ║
║ 0005___Dogiclon___912-101242 ║ 56.00 ║       5 ║ MA       ║
║ 0005___Dogiclon___912-101242 ║ 56.00 ║       5 ║ WA       ║
║ 0005___Dogiclon___912-101242 ║ 56.00 ║       5 ║ NY       ║
║ 0005___Dogiclon___912-101242 ║ 56.00 ║       2 ║ CA       ║
╚══════════════════════════════╩═══════╩═════════╩══════════╝
我猜PSEDOO代码应该是:

SHOW all products
WHERE 
    instock (any location) > 0 AND
    (cost > 10 AND cost < 2000)
ORDER BY
    cost asc
这就是我正在尝试的:

SELECT DISTINCT
    product.ref,
    product.brand,
    inventory.scost,
    inventory.instock
FROM
    product
    JOIN inventory ON inventory.ref = product.ref
WHERE
    inventory.instock > 1 
    AND ( app.inventory.scost >= 10 AND app.inventory.scost <= 2000 ) 
GROUP BY
    product.ref
选择DISTINCT
product.ref,
产品、品牌,
inventory.scost,
库存量
从…起
产品
在inventory.ref=product.ref上加入库存
哪里
inventory.instock>1

和(app.inventory.scost>=10和app.inventory.scost如果您在产品中按唯一列进行分组(该列似乎为ref),则distinct不会按您希望的方式进行分组。distinct负责每个返回行的唯一性(返回所有值)。在这种情况下,要在每个product ref的结果中获得一行,您需要删除不同的部分,将product.mfr添加到group by并聚合非分组列,如下所示:

SELECT
    product.ref,
    product.mfr,
    group_concat(inventory.scost) as scost,
    group_concat(inventory.instock) as instock,
FROM
    product
    JOIN inventory ON inventory.ref = product.ref
WHERE
    inventory.instock > 1 
    AND ( app.inventory.scost >= 10 AND app.inventory.scost <= 2000 ) 
GROUP BY
    product.ref, product.mfr

您需要向我们展示一些样本数据和预期结果,因为数据导致了您意想不到的结果。我猜您的库存表中有多条记录与单个产品参考关联。@Shadow啊,是的,产品没有重复的参考,但库存不明白为什么问题和yo上的negs你的答案。这似乎有效,但我只是在学习MySQL,所以我可能需要阅读更多关于group_concat及其工作原理的内容。谢谢!@3zzy,然后让我解释一下。这个问题得到了否决票,因为你没有解释问题是什么,因此不清楚你问了什么。这个答案得到了否决票,因为这是一个胡乱猜测,如果这个胡乱猜测实际上是对的,那么这个问题是重复的,应该这样关闭。@Shadow Fair,我刚刚用所有细节更新了描述。我不确定这个答案是否适用于我的情况,但确实返回唯一的行。@3zzy如果对库存表的字段应用任何聚合函数,都将返回唯一的行。
SELECT
    product.ref,
    product.mfr,
    group_concat(inventory.scost) as scost,
    group_concat(inventory.instock) as instock,
FROM
    product
    JOIN inventory ON inventory.ref = product.ref
WHERE
    inventory.instock > 1 
    AND ( app.inventory.scost >= 10 AND app.inventory.scost <= 2000 ) 
GROUP BY
    product.ref, product.mfr
group_concat(column order by column1, [...])