0

すべての注文とそのオプションを表示するクエリを作成しようとしています。これで完了ですが、注文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**

これがクエリの動作方法です

SELECT 
  o.order_id, 
  o.name, 
  o.value, 
  GROUP_CONCAT(o.order_id, o.name, o.value 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
4

1 に答える 1

1

GROUP BY order_id代わりに、を使用GROUP_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;

SQLフィドルデモ

が探しているものでない場合は、他の集計関数を使用する必要がありますが、集計関数のない句の句にGROUP_CONCAT含まれていない列は含めないでください。そうしないと、一貫性のないデータが得られます。GROUP BYSELECT


アップデート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

句の2つの列o.name, o.valueは、SELECT句にない集計関数にも含まれていないGROUP BYため、これらの2つの列の値に一貫性がないため、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;
于 2013-02-07T06:57:02.590 に答える