Из всех аспектов кодирования SQL - это мое самое слабое умение, поэтому, пожалуйста, простите меня, если я буду звучать так, как будто не знаю, о чем говорю, потому что, вероятно, !MySQL Получение результатов повторения с использованием условия «in»
Ситуация:
Создание корзины покупок, где таблица под названием «корзина» имеет поле под названием «продукты» типа VARCHAR 255, а значение «продуктов» будет запятыми строка. Каждый элемент строки будет числом, которое представляет идентификатор продукта из таблицы «товары».
Запись клиента может содержать значение в поле «товары», которое выглядит как 1,1,1,2,3. Это будет означать, что клиент добавил три пункта 1, один из пункта 2, и один из пункта 3.
Проблема:
Итак, вот инструкция SQL у меня есть в настоящее время, но проблема в том, мне нужно SQL-оператор, который будет возвращать данные повторного продукта из продукта таблицы:
SELECT product_id, product_name,price
FROM products
WHERE id in ('1','1','1','2','3')
результатом этого будет набор из трех предметов из «продуктов» таблицы, 1 и 2 и 3. другими словами, это не дает мне данных о продукте для трех «1», это только дает мне отличное значение. Не 3 значения из таблицы продуктов, а 5 значений из таблицы продуктов, где первые три результата идентичны, потому что они одинаковые product_id = 1.
Мне нужен SQL заявление, что даст мне избыточную информацию о продукте, потому что в конце концов, человек может заказать три виджета с product_id = 1.
корзина
id INT(15)
uid VARCHAR(32)
email VARCHAR(100)
products VARCHAR(255)
date DATETIME
checkout TINYINT(1)
продукция:
id INT(15)
product_id varchar(32)
product_name varchar(128)
product_associations varchar(255)
short_description varchar(255)
long_description mediumtext
price varchar(32)
image varchar(128)
Мой PHP код:
$productslist = str_replace(",","','",$row->products);
$productslist = "'" . $productslist . "'"; echo $productslist;
$sql2 = "SELECT product_id, product_name,price FROM products WHERE id in ($productslist)";
$query2 = $this->db->query($sql2);
$i = 0;
if ($query2->num_rows() > 0){
foreach ($query2->result() as $row2){
$products[$i]['product_id'] = $row2->product_id;
$products[$i]['product_name'] = $row2->product_name;
$products[$i]['price'] = $row2->price;
$i++;
}
}
... и результат этого запроса будет:
Product ID: #0001
Product Name: "Ducky"
Price: $1.50
Product ID: #0002
Product Name: "Horse"
Price: $1499.00
Product ID: #0003
Product Name: "T-shirt"
Price: $5.00
Update: В интересах наилучшей практики, я изучал «нормализованное» теорию таблицы, а затем откат приведенную выше схему поля с разделителями-запятыми. Я создал отдельную таблицу под названием «cart_list», с полями:
id
cart_id
product_id
... и я просто вставить новые записи для каждого нового «добавить в корзину», шпонка в корзине таблицы в cart_id поля, привязанные к данным продукта через поле product_id.
я думаю, что вам нужно, чтобы нормализовать поле, которое выглядит как '1,1,1,2,3'. –
Возможно, что «SELECT DISTINCT id» или «GROUP BY» могут работать, если вы не можете предварительно фильтровать свой список идентификаторов. – mario
Даниэль прав - вам нужно использовать таблицу, которая объединяет корзину и продукты, а не список с разделителями-запятыми. –