Wie könnte ich die Datenbankabfragen oder das Programm optimieren?
<?php
include 'db.php';
// Five Most Frequently Ordered Products
$query_highesttotalquantity = "
SELECT
id_product,
SUM(anzahl) total_quantity
FROM
bestellungen_products
GROUP BY
id_product
ORDER BY
total_quantity DESC
LIMIT 5
";
$highesttotalquantity = $conn->query($query_highesttotalquantity);
if (!$highesttotalquantity) {
die("Query Error (highesttotalquantity): " . $conn->error);
}
// Five Products with the Highest Number of Orders
$query_highesnumb = "
SELECT
id_product,
COUNT(DISTINCT id_bestellung) order_count
FROM
bestellungen_products
GROUP BY
id_product
ORDER BY
order_count DESC
LIMIT 5
";
$highesnumb = $conn->query($query_highesnumb);
if (!$highesnumb) {
die("Query Error (highesnumb): " . $conn->error);
}
// Five Least Frequently Ordered Products
$query_lowest5 = "
SELECT
id_product,
SUM(anzahl) total_quantity
FROM
bestellungen_products
GROUP BY
id_product
ORDER BY
total_quantity ASC
LIMIT 5
";
$lowest5 = $conn->query($query_lowest5);
if (!$lowest5) {
die("Query Error (lowest5): " . $conn->error);
}
// Order History Over the Last Four Weeks
$query_last4weeks = "
SELECT
YEARWEEK(bestelldatum, 1) week,
SUM(bp.anzahl) total_quantity
FROM
bestellungen b
JOIN
bestellungen_products bp ON b.id_bestellung = bp.id_bestellung
WHERE
bestelldatum >= CURDATE() - INTERVAL 4 WEEK
GROUP BY
week
ORDER BY
week DESC
";
$last4weeks = $conn->query($query_last4weeks);
if (!$last4weeks) {
die("Query Error (last4weeks): " . $conn->error);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Admin Statistics</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
}
h1, h2 {
color: #333;
}
.stat-section {
margin-bottom: 20px;
}
</style>
</head>
<body>
<h1>Admin Statistics</h1>
<div class="stat-section">
<h2>Five Most Frequently Ordered Products</h2>
<?php while ($product = $highesttotalquantity->fetch_assoc()): ?>
<p>Product ID: <?= htmlspecialchars($product['id_product']) ?> - Total Quantity: <?= htmlspecialchars($product['total_quantity']) ?></p>
<?php endwhile; ?>
</div>
<div class="stat-section">
<h2>Five Products with the Highest Number of Orders</h2>
<?php while ($product = $highesnumb->fetch_assoc()): ?>
<p>Product ID: <?= htmlspecialchars($product['id_product']) ?> - Order Count: <?= htmlspecialchars($product['order_count']) ?></p>
<?php endwhile; ?>
</div>
<div class="stat-section">
<h2>Five Least Frequently Ordered Products</h2>
<?php while ($product = $lowest5->fetch_assoc()): ?>
<p>Product ID: <?= htmlspecialchars($product['id_product']) ?> - Total Quantity: <?= htmlspecialchars($product['total_quantity']) ?></p>
<?php endwhile; ?>
</div>
<div class="stat-section">
<h2>Order History Over the Last Four Weeks</h2>
<?php while ($week = $last4weeks->fetch_assoc()): ?>
<p>Week: <?= htmlspecialchars($week['week']) ?> - Total Quantity Ordered: <?= htmlspecialchars($week['total_quantity']) ?></p>
<?php endwhile; ?>
</div>
</body>
</html>
1 Antwort
Du gruppierst und sortierst in deiner MySQL-Abfrage eine Menge, was natürlich bedeutet, dass die Performance stark von den gesetzten Indizes und Partitionen abhängt. Ich hoffe, du hast entsprechend Indexe oder Partitionen gesetzt, um die Abfragen zu optimieren.
Beim Abschnitt "Five Least Frequently Ordered Products" verstehe ich nicht ganz den Sinn der aktuellen Herangehensweise. Der Fokus liegt hier auf der Anzahl der Produkte, nicht der Bestellungen. Das Problem dabei ist, dass dies keine wirkliche Aussagekraft über die Beliebtheit eines Produkts hat. Wenn beispielsweise eine Person ein Produkt 10-mal bestellt, ist das Ergebnis dasselbe, als hätten 10 verschiedene Personen das Produkt einmal bestellt.
Der Hintergrund ist, dass Ladenhüter oft im Preis reduziert werden und dann mehrfach von derselben Person gekauft werden, was die Statistik verfälschen kann. Es wäre daher sinnvoller, die Anzahl der Bestellungen zu zählen, in denen ein Produkt gekauft wurde. Das gibt dir eine präzisere Vorstellung davon, wie beliebt ein Produkt wirklich ist. Dasselbe gilt natürlich auch für die Top-Produkte.
Andernfalls besteht die Gefahr, dass deine Statistik - und womöglich sogar deine Lagerhaltung - durch einmalige Massenbestellungen stark verfälscht wird.
Außerdem wäre es hilfreich, in die Abfrage ein
HAVING SUM(anzahl) > 0
einzufügen, um festzustellen, welche Produkte überhaupt nie bestellt wurden. So kannst du gezielt Maßnahmen ergreifen, um diese Produkte zu fördern oder aus dem Sortiment zu nehmen.
Wo genau hakt es bei deinem Skript? Ist die Ausführungszeit das Problem?