Mysql 分组联接查询结果

Mysql 分组联接查询结果,mysql,join,group-by,Mysql,Join,Group By,我正在尝试编写一个查询,显示所有订单及其选项。到目前为止已经完成了,但是当我尝试按订单id对它们进行分组时,它只为每个选项打印一行,而不是订单id及其下的所有选项 我遗漏了一些东西,但不知道是什么:) 这是我的 $sql = 'SELECT * FROM `order` RIGHT JOIN `order_option` on order.order_id=order_option.order_id where order_status_id =

我正在尝试编写一个查询,显示所有订单及其选项。到目前为止已经完成了,但是当我尝试按订单id对它们进行分组时,它只为每个选项打印一行,而不是订单id及其下的所有选项

我遗漏了一些东西,但不知道是什么:)

这是我的

$sql = 'SELECT *
        FROM `order` RIGHT JOIN `order_option`
        on order.order_id=order_option.order_id
        where order_status_id = 2 
        group by order_option.order_option_id';

$retval = mysql_query( $sql, $conn );
if(! $retval )
{
  die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
    print "ID:{$row['order_id']}  <br> ".
         "OPTION NAME: {$row['name']} <br> ".
         "VALUE: {$row['value']} <br> ".
         "--------------------------------<br>";
} 
echo "Fetched data successfully\n";
mysql_close($conn);

?>

**UPDATE 1**

您应该改为按订单id分组,并使用
GROUP\u CONCAT
在同一行中获取订单的所有选项:

SELECT 
  o.order_id,
  GROUP_CONCAT(oo.order_option_id SEPARATOR ',') AS Options
FROM `order` AS o
RIGHT JOIN `order_option` AS oo on o.order_id = oo.order_id
where o.order_status_id = 2 
group by o.order_id;

如果
GROUP\u CONCAT
不是您想要的,那么您必须使用其他聚合函数,但不要在
SELECT
子句中包含任何不在
groupby
子句中且没有聚合函数的列。否则您将得到不一致的数据


更新1 查询不起作用的原因:

SELECT 
  o.order_id, 
  o.name, 
  o.value, 
  GROUP_CONCAT(o.order_id SEPARATOR ',') AS Options 
FROM order_option AS o 
LEFT JOIN order AS oo on o.order_id = oo.order_id 
where oo.order_status_id = 2 
group by o.order_id
由于
SELECT
子句中的两列
o.name,o.value
既不在聚合函数中,也不在
GROUP BY
子句中,因此这两列的值不一致,MySQL会为它们获取任意值。请尝试以下方法:

SELECT 
  o.order_id, 
  o.name, 
  o.value, 
  GROUP_CONCAT(o.order_id SEPARATOR ',') AS Options 
FROM order_option AS o 
LEFT JOIN order AS oo on o.order_id = oo.order_id 
where oo.order_status_id = 2 
group by o.order_id, 
         o.name,
         o.value;

我可以数一数,我见过(知道自己在做什么的人)在两只手的手指上使用右连接的次数。对于每个右连接,显然都有一个逻辑上相同的左连接,因为左连接更直观,我们倾向于使用它们。其次,查询中的任何位置都没有聚合函数,因此GROUP BY无法执行您认为它正在执行的任何操作!这正是我想要的我想。。。但是无法将其分组到代码的“while{”部分。我丢失了something@largan-请更新您的代码,并说明它是如何工作的。这是我的代码$sql=“选择o.order\U id、o.name、o.value、GROUP\U CONCAT(o.order\U id分隔符’,”作为o.order\u选项的选项,$result=mysql\u查询($sql);while($row=mysql\u获取assoc($result)){$id=$row['order\u id'];$name=$row['name'];$value=$row['value'];print“$id name:$name:$value.”;打印“
--------------
”;}这是结果ID 29名称:option1,值:39问题是每个ID都有option2,并且不会显示
SELECT 
  o.order_id, 
  o.name, 
  o.value, 
  GROUP_CONCAT(o.order_id SEPARATOR ',') AS Options 
FROM order_option AS o 
LEFT JOIN order AS oo on o.order_id = oo.order_id 
where oo.order_status_id = 2 
group by o.order_id, 
         o.name,
         o.value;