表LIST包含用户(NUM_USER)已选择的项目(ITEM_NAME),每个项目都有一个类别(CATEGORY)。 表ITEM具有所有可能的项目(NAME),每个项目都有一个类别(CATEGORY)
要显示特定类别中尚未包含在用户列表中的所有项目,我首先从用户列表中选择所有项目,然后从类别中选择所有项目,最后我将数组区分为显示用户尚未选择的项目
下面的代码正确显示了两个数组,但第三部分只显示
Array ( )
无论我将哪两个数组放入diff中。几天后,我想知道我的数据库模式是否有问题 - 我认为这应该是一个简单的请求。
$sqlall="SELECT ITEM_NAME FROM LIST WHERE NUM_USER=23";
$resultall = $conn->query($sqlall);
if ($resultall->num_rows > 0) {
while($row = $resultall->fetch_assoc()) {
$new_array[ $row['id']] = $row;
echo "<br>
".$row["ITEM_NAME"]."";
}
echo "";
} else {
echo "0 results for category $CAT_NAME";
}
echo "<HR>";
$sql2="SELECT NAME FROM ITEM WHERE CATEGORY='2' ORDER BY `ITEM`.`QUANTITY` DESC ";
$result2 = $conn->query($sql2);
if ($result2->num_rows > 0) {
while($row = $result2->fetch_assoc()) {
$new_array2[ $row['id']] = $row;
echo "<br>
".$row["NAME"]."";
}
echo "";
} else {
echo "0 results for category $CAT_NAME";
}
echo "<HR>";
$remaining = array_diff($new_array, $new_array2);
print_r($remaining);
答案 0 :(得分:0)
我认为你应该找出一个合适的数据库模式并构建一个查询来询问你的数据库的最终结果。使用查询语言询问数据库,而不是将数据拉到PHP以手动“区分”结果。这只是开销。
我已经修改了你的模式以获得SQLfiddle的工作模式并用于演示目的。
首先演示:http://sqlfiddle.com/#!9/749fc/1/0
基本上,我已将List重命名为Cart。更重要的变化是,购物车通过user_id
到item_id
关系为用户存储商品。我离开了quantity
,这不是问题,你知道如何排序。
CREATE TABLE Cart
(`id` int, `user_id` int, `item_id` int)
;
CREATE Table Items
(`id` int, `category` varchar(55), `name` varchar(20), `description` varchar(50))
;
INSERT INTO Items
(`id`, `category`, `name`, `description`)
VALUES
(1, 'cars', 'red car', 'a red car'),
(2, 'cars', 'blue car', 'a blue car without radio'),
(3, 'cars', 'blue truck', 'a blue truck with big wheels'),
(4, 'cars', 'a car', 'a car'),
(5, 'cars', 'b car', 'b radio'),
(6, 'cars', 'c truck', 'c truck'),
(7, 'balls', 'blue ball', 'big blue ball')
;
INSERT INTO Cart
(`id`, `user_id`, `item_id`)
VALUES
(1, '1', '1'),
(2, '1', '2'),
(3, '1', '3'),
(4, '2', '4'),
(5, '2', '4'),
(6, '2', '5')
;
现在,您的目标是
让我们尝试将其转换为“粗略的”SQL:
Select * FROM items
WHERE item.category = X
AND item.id NOT_IN other_table
注意:此处的关键是NOT IN
子句中的WHERE
。
当然,other_table
现在已经被另一个表的查询所取代:
Select all item_id
FROM Cart
WHERE user_id = Y
因此,当您将两者结合使用时,最终会得到以下查询:
SELECT
item.id, item.category, item.name, item.description
FROM
Items item
WHERE
item.category = 'cars'
AND
item.id NOT IN
(SELECT item_id value FROM Cart WHERE user_id = 2)
;