php / mysql验证以避免重复条目

时间:2016-07-11 14:36:01

标签: php mysql arrays

表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);

1 个答案:

答案 0 :(得分:0)

我认为你应该找出一个合适的数据库模式并构建一个查询来询问你的数据库的最终结果。使用查询语言询问数据库,而不是将数据拉到PHP以手动“区分”结果。这只是开销。

我已经修改了你的模式以获得SQLfiddle的工作模式并用于演示目的。

首先演示:http://sqlfiddle.com/#!9/749fc/1/0

基本上,我已将List重命名为Cart。更重要的变化是,购物车通过user_iditem_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)
;