2011-01-04 8 views
0

나는 쿼리하는 테이블이 두 개 있습니다. 한 테이블에는 사진에 등장하는 플레이어가 죽었는지, 명예의 전당에 있는지 등을 나타내는 필드가 있습니다. 방금 추가 한 필드는 "new_flag"입니다. 이 사진은, 그 결과이 같은 BY 그룹과MySQL 도움말 선택; 서브 쿼리?

name   firstname lastname  hall_of_fame deceased new_flag 
----   --------- --------  ------------ -------- -------- 
EARL AVERILL SR EARL  AVERILL SR Y    Y   Y 
BILL TERRY  BILL  TERRY  Y    Y   N 
BILL TERRY  BILL  TERRY  Y    Y   Y 
BILL TERRY  BILL  TERRY  Y    Y   N 
BOBBY DOERR  BOBBY  DOERR  Y    N   N 
BOBBY DOERR  BOBBY  DOERR  Y    N   N 

(일부 팀은 이상의 제품/사진을 참고)를 볼 것 GROUP BY없이 내 인벤토리

새로운 여부를 나타냅니다 내 쿼리는 이렇게 보이지만 각 플레이어는 둘 이상의 레코드를 가질 수 있기 때문에 항상 새로운 플래그를 찾을 수있는 것은 아닙니다.

SELECT CONCAT(a.firstname,' ',a.lastname) AS name, 
      a.firstname, 
      a.lastname, 
      b.hall_of_fame, 
      b.deceased, 
      b.new_flag 
FROM  vm_product_name AS a, 
      vm_product_new_attribute AS b 
WHERE b.hall_of_fame ='Y' 
    AND a.product_id = b.product_id 
GROUP BY CONCAT(a.firstname,' ',a.lastname) 
ORDER BY a.lastname, 
      a.firstname; 

문제는 내가 또한 그들이 적어도이있는 경우 플레이어의 이름 옆에 "새로운"아이콘을 추가 할 ..... 난 단지 각 플레이어가 내 웹 페이지에 한 번에 표시 할 것입니다 만, 새 사진 1 장. 내가 어떻게 할 수있는 아이디어?

이것이 최선의 방법은 아니지만 Joomla/Virtumart 확장 기능으로 제작되었으며 현재 데이터베이스 구조를 변경할 수 없습니다. 당신이 왼쪽을 할 수 있습니다

+1

... 대신 가입 그래서 "단지 사용, GROUP BY 절에서 CONCAT를 사용하지 않는 GROUP BY a.firstname, a.lastname ". GROUP BY (WHERE와 ORDER BY뿐만 아니라) 함수를 사용하는 것을 피하는 주된 이유는 MySQL이 인덱스를 사용하지 못하게하고 쿼리가 상당히 느려지는 임시 테이블을 생성 할 수 있기 때문입니다. –

답변

4
SELECT CONCAT(a.firstname, ' ', a.lastname) AS name, a.firstname, a.lastname, 
    b.hall_of_fame, b.deceased, MAX(b.new_flag) AS new_flag 
FROM vm_product_name AS a 
    INNER JOIN vm_product_new_attribute AS b 
     ON a.product_id = b.product_id 
WHERE b.hall_of_fame = 'Y' 
GROUP BY a.lastname, a.firstname 
ORDER BY a.lastname, a.firstname 
+0

+1 : 그러나 예를 들어 같은 플레이어의 행이 두 개이고 사망자가 두 개의 다른 값을 가진다면 임의의 행 중 하나를 선택합니다. http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html –

+0

대단히 감사합니다! 나는 이것이 그것을했다고 생각한다. @nate c 흠. 이 일을 막기 위해 어쨌든 있습니까? – relyt

+1

플레이어는 중복되지 않은 자신의 테이블을 가져야합니다.하지만 위 테이블에서는 테이블에 대한 제어권이 없습니다. –

-1

는 여러 열로 그룹, 수 여담으로

SELECT * FROM (
SELECT CONCAT(vm_product_name.firstname, ' ', vm_product_name.lastname) AS name 
vm_product_name.firstname AS firstname, 
vm_product_name.lastname, AS lastname, 
vm_product_new_attribute.hall_of_fame AS hall_of_fame, 
vm_product_new_attribute.deceased AS deceased, 
vm_product_new_attribute.new_flag AS new_flag 
FROM vm_product_name LEFT JOIN vm_product_new_attribute ON vm_product_name.product_id = vm_product_new_attribute.product_id 
ORDER BY lastname, firstname) AS MYRESULT GROUP BY CONCAT(lastname, ' ',firstname); 
+0

왼쪽 가입은 무엇을 수행합니까? 가입하지 않는 null에 문제가 없습니다. –

+0

안녕하세요! 표 B에 일치하는 product_id가없는 경우 어떻게해야합니까? 제외 될 것입니다 ... ** 전체 사용자가 제외 될 것입니다 ... – CarpeNoctumDC