Я очень новичок в SQL, поэтому у меня возникла пара проблем, чтобы разобраться.База данных предназначена для интернет-магазина, а ее структура примерно такая:
пользователи: UserID, UserName и т. Д.
прайс-листы: PricelistID, UserID, ProductItemID, цена
productitems: ProductItemID, ProductID, ItemID
products: ProductID, ManufacturerID, WebPageText и т. д.
У каждого товара может быть один или несколько предметов (например, если на странице товара продаются футболки,может быть 5 различных вариантов футболки для продажи).Это довольно нормально.Что не является нормальным, так это то, что цена каждого товара определяется тем, что указано в прайс-листе пользователя, поскольку каждому пользователю назначается определенная цена.Не всем пользователям назначена цена за каждый товар.
Вот вопрос: от руководства требуется, чтобы пользователь мог видеть каждый продукт, даже если этот продукт отсутствует в прайс-листе пользователя.Если у пользователя нет записи в прайс-листе для товара, на странице должна появиться надпись «Свяжитесь с нами для определения цены».Я не смог понять, как это сделать с помощью одного запроса.Каждое объединение, в котором я пытался задействовать таблицу прайс-листов, выбрасывало продукты, для которых пользователю не была назначена цена.Мне дают только ProductID и UserID.Я поместил свой код ниже, который представляет собой смесь MySQL и PHP.Это работает, но это неуклюже, особенно учитывая, что мне приходится повторять второй запрос снова и снова.Пожалуйста, скажите мне, как я действительно должен это делать.
$query_product = sprintf("SELECT * , (items.Stock - (SELECT Coalesce(Sum(DetailQuantity),0)
FROM orderdetails
INNER JOIN orders ON OrderID = DetailOrderID
INNER JOIN productitems ON orderdetails.ProductItemID = productitems.ProductItemID
INNER JOIN products ON productitems.ProductID = products.ProductID
INNER JOIN items ON productitems.ItemID = items.ItemID
WHERE OrderDate > ProductUpdateDate))*ProductLive
AS NumLeft
FROM productitems
INNER JOIN products ON products.ProductID = productitems.ProductID
JOIN items ON productitems.ItemID = items.ItemID
WHERE products.ProductID = %s",GetSQLValueString($ProductID, "int"));
$product = mysql_query($query_products, $x) or die(mysql_error());
$row_product = mysql_fetch_assoc($product);
//after narrowing down to one productitem, either through user selections or while looping through $row_product:
$query_price = sprintf("SELECT Price FROM pricelists
WHERE UserID = %s AND ProductItemID = %s", GetSQLValueString($UserID, "int"), GetSQLValueString($row_product['ProductItemID'], 'int'));
$price = mysql_query($query_price, $x) or die(mysql_error());
$row_price = mysql_fetch_assoc($price);
$row_product['Price'] = $row_price['Price'];
Позже в коде я проверяю, пусто ли $ row_products ['Price'] или нет, чтобы определить, что отображается на странице.
РЕДАКТИРОВАТЬ: Я думал, что это будеточевидно, но ... я должен ограничить прайс-листы WHERE UserID = %s.
Это означает, что я не могу просто привязать LEFT JOIN pricelists ON pricelists.ProductItemID = productitems.ProductItemID
, который был фактически первым, что я попробовал, и который не работает.Ограничение внешнего соединения в операторе WHERE превращает его во внутреннее соединение.