2016-07-11 3 views
1

В таблице LIST есть элементы (ITEM_NAME), выбранный пользователем (NUM_USER), каждый элемент имеет категорию (CATEGORY). Стол ITEM имеет все возможные предметы (NAME), каждый из которых имеет категорию (КАТЕГОРИЯ)Проверка php/mysql во избежание дублирования записей

Чтобы отобразить все элементы из определенной категории, которых еще нет в списке пользователей, я сначала выбираю все элементы из списка пользователей, затем все элементы из категории, наконец, я различаю массивы для отображения элементов, которые пользователь еще не выбрал.

Приведенный ниже код отображает два массива правильно, но и для третьей части он просто отображает

Array () 

независимо от того, в каком порядке я поставил 2 массивы для дифф. Через пару дней я задаюсь вопросом, есть ли что-то неправильное с моей схемой db - я думаю, что это должен быть простой запрос.

$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

Я думаю, вы должны разработать правильную схему базы данных и построить один запрос, чтобы спросить свою базу данных о конечном результате. Используйте язык запросов, чтобы запросить базу данных, вместо того, чтобы вытаскивать данные на PHP, чтобы вручную «разбить» результаты. Это просто накладные расходы.

Я немного изменил вашу схему, чтобы получить рабочую схему для SQLfiddle и для демонстрационных целей.

Demo первый: http://sqlfiddle.com/#!9/749fc/1/0

В принципе, я уже переименован список в корзину. Более важным изменением является то, что корзина хранит элементы для пользователя по 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) 
; 
+1

Это работает отлично. Спасибо миллион –

+0

Добро пожаловать :) –