2013-08-22 3 views
3

Из всех аспектов кодирования 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.

+3

я думаю, что вам нужно, чтобы нормализовать поле, которое выглядит как '1,1,1,2,3'. –

+1

Возможно, что «SELECT DISTINCT id» или «GROUP BY» могут работать, если вы не можете предварительно фильтровать свой список идентификаторов. – mario

+1

Даниэль прав - вам нужно использовать таблицу, которая объединяет корзину и продукты, а не список с разделителями-запятыми. –

ответ

3

немного некрасиво, но это будет делать трюк:

create temporary table t (id integer); 
insert into t(id) values (1),(1),(2),(2),(3); 


select product_id, product_name,price from t inner join products where t.id = products.id; 

drop table t; 
+1

Очень интересно, я попробую это. Спасибо. – TARKUS

+0

Согласен, применение темповой таблицы было бы немного уродливым. Тем не менее, сделают трюк. –

+1

Yup. Это уродливый хак. Вы должны нормализовать свои таблицы. Он обеспечивает лучшее решение и позволяет базе данных выполнять проверку внешнего ключа. Пример. Что произойдет, если элемент с идентификатором, если 2 удаляется. Как вы собираетесь входить и удалять все идентификаторы с поля? – iWantSimpleLife

Смежные вопросы