다음 쿼리는 스프 목록과 각 스프에 대한 목록을 표시합니다.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