Сложный запрос MySQL, фильтр из нескольких таблиц

#mysql

#mysql

Вопрос:

У меня есть ORDER_TABLE для хранения всего ПОРЯДКА ( order_id , order_name)

В ТАБЛИЦЕ ORDER_ITEMS_TABLE хранятся все элементы каждого порядка ( order_item_id , order_id, item_name ). Каждая строка является элементом, а порядок имеет много строк в ORDER_ITEMS_TABLE

У меня есть входные данные, которые позволяют пользователю вводить список элементов, разделенных запятой (item1, item2, item3), и когда пользователь отправляет, я должен получить все заказы из ORDER_TABLE, которые содержат все элементы выше (item1 И item2 И item3)

Помогите мне, пожалуйста

Ответ №1:

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

 SELECT ot.order_name, oit.item_name
FROM ORDER_ITEMS_TABLE oit
INNER JOIN ORDER_TABLE ot ON ot.order_id = oit.order_id
WHERE oit.order_item_id IN (your,list,of,items)
  

Комментарии:

1. спасибо за помощь, но мне нужно выбирать заказы, которые содержат все из них, а не какие-либо из них

2. Это немного отличается от исходного вопроса. Вы могли бы использовать запрос, который я вам дал, и сократить результаты на стороне сценариев — я не могу придумать элегантное решение только для SQL для нового вопроса.

Ответ №2:

Чтобы расширить ответ @Crontabs:

 $items = $_POST['items'];
$item_array = explode(',',$items);
foreach ($item_array as $item) 
{
  $item = mysql_real_escape_string($item);
}
$items = implode("','", $item_array);
$query = "SELECT ot.order_name, oit.item_name     
          FROM ORDER_ITEMS_TABLE oit     
          INNER JOIN ORDER_TABLE ot ON ot.order_id = oit.order_id     
          WHERE oit.order_item_id IN ('$items')  "; 
  

Теперь вы правильно экранировали эти элементы CSV.

Комментарии:

1. пользователь904427 не пометил его «php», поэтому я не делал никаких предположений. 😉

2. @Crontab, согласно профилю пользователя, он php-пользователь, так что это имело смысл 🙂