mysql join получает значение или ноль в столбце - PullRequest
0 голосов
/ 23 ноября 2011

Я очень новичок в 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 превращает его во внутреннее соединение.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Добавьте таблицу прайс-листов в качестве левого соединения к основному запросу:

SELECT field1, field2, ..., pl.*
FROM orderdetails 
INNER JOIN orders ON OrderID = DetailOrderID 
...
LEFT JOIN pricelists pl PN pl.ProductItemID = productitems.ProductItemID
..

В вашем коде проверьте, является ли цена в таблице прайс-листов нулевой, если да, покажите текст.

1 голос
/ 23 ноября 2011

Вы должны использовать для этого внешнее соединение.Вот отличное описание разницы между внутренним и внешним соединением -> внутреннее соединение против внешнего соединения

...