Следующий запрос отображает список супов и для каждого супа список ингредиентов.GROUP_CONCAT и LEFT_JOIN - записи фильтра
//Query only for demonstration
SELECT a.id_soup, a.soup,
GROUP_CONCAT(DISTINCT b.id_vegetables) AS vegetables_id,
GROUP_CONCAT(DISTINCT b.vegetables) AS vegetables_list
FROM soups a
LEFT JOIN ingredients ing ON a.soup = ing.soup_id
LEFT JOIN vegetables b ON b.id_vegetables = ing.list_vegetables
GROUP BY a.id_soup
Я хочу, чтобы фильтровать записи, так что отображаются только те, в которых суп имеет определенный ингредиент (например, картофель). Что-то вроде:
SELECT a.id_soup, a.soup,
GROUP_CONCAT(DISTINCT b.id_vegetables) AS vegetables_id,
GROUP_CONCAT(DISTINCT b.vegetables) AS vegetables_list
FROM soups a
LEFT JOIN ingredients ing ON a.soup = ing.soup_id
LEFT JOIN vegetables b ON b.id_vegetables = ing.list_vegetables
AND ing.list_vegetables LIKE "potatoes"
GROUP BY a.id_soup
Эти запроса не фильтрует записи, но список ингредиентов больше не отображает все ингредиенты супа, только отображая ингредиент картофель.
Каков наилучший способ сделать это правильно?
Редакция:
с несколькими условиями - PHP и SQL:
$typesQuery = "";
$bind=array();
sqlQuery = "SELECT a.id_soup, a.soup, a.restaurant,
GROUP_CONCAT(DISTINCT b.id_vegetables) AS vegetables_id,
GROUP_CONCAT(DISTINCT b.vegetables) AS vegetables_list
FROM soups a
LEFT JOIN ingredients ing ON a.soup = ing.soup_id
LEFT JOIN vegetables b ON b.id_vegetables = ing.list_vegetables ";
if($restaurant) {
$sqlQuery .= " AND a.restaurant LIKE ? ";
$typesQuery .= "s" ;
$bind[] = $restaurant;
}
if($vegetables) {
$sqlQuery .= " AND ... ";
$typesQuery .= "s" ;
$bind[] = $vegetables;
}
//EDITED:
$vegetables = 'potatoes';
if($vegetables) {
$sqlQuery .= " HAVING SUM(CASE WHEN b.vegetables IN (?) THEN 1 ELSE 0 END) = 1 ";
$typesQuery .= "s" ;
$bind[] = $vegetables;
}
$sqlQuery .= " GROUP BY a.id_soup LIMIT ?,? ";
if ($statementQuery = $conexion->prepare($sqlQuery)){
$typesTotal = $typesQuery;
$bindTotal = array_merge(array(), $bind);
$typesQuery .= "ii";
$bind[] = $start;
$bind[] = $limit;
array_unshift($bind, $typesQuery);
call_user_func_array( array($statementQuery, 'bind_param'), makeValuesReferenced($bind));
}else{
$error = $conexion->error;
$success = false;
break;
}
...
Я тестировал ваше решение на простом примере моего сообщения, и он отлично работает. Однако я не мог обратиться к моему реальному делу, потому что он фильтруется с несколькими условиями. Я редактировал свой пост. Спасибо заранее, если у вас есть еще предложения. – josei