Я хочу удалить дубликат вывода в моей таблице, таблица выглядит так:
Order No Customer Name Order
1001 John Milk
1001 John Egg
1002 Mark Milk
1002 Mark Bread
Я хочу, чтобы это было так
Order No Customer Name Order
1001 John Milk
Egg
1002 Mark Milk
Bread
В заказе no и имени клиента используется rowspan = 2
Клиент и заказ поступают из разных таблиц в моей базе данных
Запрос этой таблицы поступает из внутреннего запроса на соединение, соединяющего два
$query = mysql_query("select customer.customerName, order.orderNo, order.item
from customer inner join orderInfo on orderInfo.customerId = customer.customerId");
while($order = mysql_fetch_assoc($query))
{
echo '<tr>
<td>'.$order['orderNo'].'</td>
<td>'.$order['customerName'].'</td>
<td>'.$order['item'].'</td>
</tr>';
}
и выход вышеприведенного кода является 1-й иллюстрацией
Как мне достичь 2-й иллюстрации, что-то не так с моими отношениями в таблице или я должен использовать правильный запрос?
Возможно, вам лучше использовать group_concat:
$query = mysql_query("
SELECT
customer.customerId, customer.customerName, order.orderNo, group_concat(order.item SEPARATOR ',') as order_items
FROM
customer
INNER JOIN
orderInfo on orderInfo.customerId = customer.customerId
GROUP BY customer.customerId
");
И в вашем коде просто замените разделитель:
while($order = mysql_fetch_assoc($query))
{
echo '<tr>
<td>'.$order['orderNo'].'</td>
<td>'.$order['customerName'].'</td>
<td>'.str_replace(',','<br/>',$order['item']).'</td>
</tr>';
}
В этом случае вам не понадобится rowpan = 2.
Как сказал jarlh, это тоже не дебют, отредактируйте запрос с порядком по порядку no и используйте приведенный ниже код для вашей второй иллюстрации
$previous=-1000;
while ($row = mysql_fetch_assoc($query)
{
if($previous!=$row['orderNo'])
{
echo "<tr><td>".$row['orderNo']."</td>";
echo "<td>".$row['customerName']."</td>";
echo "<td>".$row['item']."</td>";
}
else
{
echo "<tr><td></td><td></td><td>".$row['item']."</td>";
}
$previous=$row['orderNo'];
}
проверьте этот запрос:
Select Dep, Case
When rn = 1 And c_d > 1 Then
d
When c_d = 1 Then
d
Else
Null
End D1,
Case
When rn = 1 And c_k > 1 Then
k
When c_k = 1 Then
k
Else
Null
End K1,
Case
When rn = 1 And c_m > 1 Then
m
When c_m = 1 Then
m
Else
Null
End M1
From (Select Count(1) Over(Partition By d,dep Order By d) c_d,
Count(1) Over(Partition By k,dep Order By k) c_k,
Count(1) Over(Partition By m,dep Order By m) c_m,
row_number() Over(Partition By dep Order By dep)rn,
d,
k,
m,
Dep
From (Select 'ali' d, '1000' k, 'M' m, 'x' Dep
From Dual
Union
Select 'ali' d, '1000' k, 'H' m, 'x' Dep
From Dual
Union
Select 'ali' d, '1001' k, 'M' m, 'y' Dep
From Dual
Union
Select 'ali' d, '1000' k, 'H' m, 'y' Dep
From Dual))
Если ваши данные не являются динамическими, вы можете использовать следующее:
DECLARE @varTable TABLE (OrderNo NVARCHAR(10), CustomerName NVARCHAR(60), Order NVARCHAR(60))
INSERT INTO @varTable VALUES( CAST(1001 AS NVARCHAR(10)), 'John', 'Milk')
INSERT INTO @varTable VALUES( '', '', 'Egg')
INSERT INTO @varTable VALUES( CAST(1002 AS NVARCHAR(10)), 'Mark', 'Milk')
INSERT INTO @varTable VALUES( '', '', 'Bread')
SELECT * FROM @varTable