2013-08-29 2 views
1

이 테이블에는 항목 (이 경우 숙박 시설 속성 및 데이터는 아래에 단순화되어 있음), 속성이 제공하는 편의 시설 및 항목 ID 목록 인 amenities_index가 있습니다 제공되는 각 어메니티에 대한 어메니티 ID. 최종 사용자는 원하는 수의 편의 시설을 선택할 수 있으며 원하는 결과와 일치하는 편의 시설 수의 순서대로 결과를 반환하고 싶습니다. 그래서, 그들이 3 가지 편의 시설을 검색한다면, 나는 모두 3을 제안하는 항목을 나열한 다음, 2, 1 및 마지막으로 나머지 항목을 제공하는 항목을 원합니다. 올바른 순서로 결과를 얻기 위해 노력하고 있다고 생각되는 쿼리가 있지만 일치 항목을 기반으로 한 포인트 값을 반환 할 수 있기를 기대하고 있으며 문제가 발생합니다. 더 복잡한 쿼리의 경우 SQL 기술이 약간 부족합니다. 여기두 번째 테이블의 포인트 순으로 MySQL 주문

SELECT * FROM items 
ORDER BY 
(
    SELECT count(*) AS points 
    FROM `amenities_index` 
    WHERE 
     (amenity_id = 1 || amenity_id = 2) 
     AND amenities_index.item_id = items.id 
) DESC 

그리고는 테이블과 같이 구성되어 있습니다 것입니다 : 여기

은 올바른 순서로 결과를 반환 내가 가지고있는 예제 쿼리입니다. 어떤 도움을 주셔서 감사합니다. 내가 것, 대부분의 데이터베이스에서

SELECT i.*, ai.points 
FROM items i join 
    (select ai.item_id, count(*) as points 
     from amenities_index ai 
     where amenity_id in (1, 2) 
    ) ai 
    on ai.item_id = i.id 
ORDER BY ai.points desc; 

:

SELECT i.*, 
     (SELECT count(*) AS points 
     FROM `amenities_index` ai 
     WHERE amenity_id in (1, 2) AND 
       ai.item_id = i.id 
     ) as points 
FROM items i 
ORDER BY points desc; 

당신은 또한 집계와 join 쿼리로이 작업을 수행 할 수 있습니다

items table 
id name  
1 location 1 
2 location 2 
3 location 3 
4 location 4 

amenities table 
id name 
1 fireplace 
2 television 
3 handicapped accessible 
4 kitchenette 
5 phone 

amenities_index 
item_id amenity_id 
1  2 
1  3 
1  5 
2  1 
2  2 
2  6 
3  2 
3  3 
3  4 
3  5 
+0

예상 결과 집합을 게시하십시오. –

+0

Gordon Linoff가 내가 원하는 것을 정확하게 제공했습니다. – user2726918

답변

1

당신은 select 절에 표현식을 이동하려면 첫 번째 버전보다이 버전을 선호합니다. 그러나 MySQL은 첫 번째 뷰를 허용하지만 두 번째 뷰는 허용하지 않으므로 일부 상황에서는 이상한 제한 사항이 있습니다.

관련 문제