2013-09-01 5 views
2
SELECT 
    a.customers_id, b.name, b.office, b.username, a.serial_number, a.id 
FROM 
    user_assets AS a 
left JOIN 
    customers AS b ON 
     a.customers_id = b.id 
WHERE NOT 
     (b.username LIKE 'Warehouse') 
    AND (serial_number LIKE 'R8%' 
     OR serial_number LIKE 'LR%' 
     OR serial_number LIKE 'R9%') 
GROUP BY 
    a.customers_id 
HAVING (COUNT(a.customers_id) >=2); 

쿼리는 어떤 사용자가 여러 컴퓨터를 가지고 있는지 찾아야합니다. 사용자 당 하나의 레코드 만 표시되지만 serial_number 열의 모든 관련 행을 어떻게 표시합니까?SQL 쿼리 왼쪽에 조인 레코드가 누락되었습니다.

편집은 : 그것은이 질문에

+0

왜'JOIN' 조건에'a.customers_id = a.customers_id' 조건을 넣었습니까? –

+0

'ON' 절에서'a.customers_id = a.customers_id'의 목적은 무엇입니까? – aefxx

+0

나는 그 부분을 제거했다. 나는 무언가를 시도하고 게시하기 전에 그것을 잊어 버렸다. – zoydbot

답변

0

당신은 left joingroup by을 필요로하지 않지만, 어디 절에 서브 쿼리와 조인 내부 간단한 필요 :

select b.customers_id, b.name, b.office, b.username, a.serial_number, a.id 
from user_assets a, customers b 
WHERE a.customers_id = b.id 
    and b.username != 'Warehouse' 
    and (serial_number LIKE 'R8%' or serial_number LIKE 'LR%' or serial_number LIKE 'R9%') 
    and (select count(1) from user_assets a1 
     where a1.customers_id=b.id 
     and (serial_number LIKE 'R8%' or serial_number LIKE 'LR%' or serial_number LIKE 'R9%') 
    ) >= 2 

또한 일련 번호에 like -predicates 대신 asset_types 디렉토리 테이블을 만들고 사용하는 것을 고려해야합니다. 일반적으로 더 효과적이며 더 나은 방법이 될 것입니다.

+0

대단히 감사합니다. 이것은 내가 필요한 것입니다. 예를 들어 일련 번호가 r8, r9 또는 lr 이외의 값으로 시작하는 자산을 가진 사용자가 이제 – zoydbot

+0

을 표시하고있는 것과 같은 조건을 벗어난 결과를 반환하더라도 어떤 이유로 든 내부에 동일한 유사 술어를 포함해야 할 수 있습니다. 검색어도? 이러한 일련 번호는 자산이 컴퓨터라는 것을 의미합니까? –

+0

아플 시도하십시오. 추가 결과는 여러 애셋을 가진 사용자이지만 추가 애셋은 컴퓨터가 아니므로 결과에서 해당 애셋을 제외하고 싶습니다. 여러 자산이있는 사용자를 표시하려고하지만 모든 자산의 일련 번호가 r8, r9 및 lr로 시작하는 경우에만 표시하고 싶습니다. – zoydbot

0

GROUP BY의 사용에 대한 uneeded으로 내가하려고했던 일, 그리고 $by이었다로

and a.customers_id = a.customers_id을 제거 - 그 이름에서 알 수 있듯이 - 그룹 결과 (에 경우에 따라 user_assets 'customer_id). GROUP BY을 그대로두면 조건에 맞는 모든 레코드가 반환됩니다.

내가 원했던 것은 각각의 고객이 레코드를 그룹화하는 방법이라고 생각합니다. ORDER BY a.customer_id을 사용하고 응용 프로그램 논리에서 레코드를 처리해야합니다.

SELECT a.id, 
     a.customers_id,   
     a.serial_number, 
     b.name, 
     b.office, 
     b.username 
    FROM user_assets AS a 
    LEFT JOIN customers AS b 
    ON a.customers_id = b.id 
WHERE b.username != 'Warehouse' 
    AND (a.serial_number LIKE 'R8%' 
    OR a.serial_number LIKE 'LR%' 
    OR a.serial_number LIKE 'R9%') 
ORDER BY a.customer_id 

예 출력 :

편집는이 작업을 예로들 수

+----+--------------+---------------+-----+ 
| id | customers_id | serial_number | ... | 
+----+--------------+---------------+-----+ 
| 3 |   11 | R8-xyz  | ... | 
| 4 |   13 | R9-abc  | ... | 
| 5 |   13 | R8-xyz  | ... | 
| 6 |   13 | LR-abc  | ... | 
| .. |   .. | ...   | ... | 
| 37 |   21 | LR-abc  | ... | 
| 38 |   21 | LR-def  | ... | 
+----+--------------+---------------+-----+ 
+0

덕분에, 나는 그것을 시도했지만 어떤 것은 몇 가지 문제점을 가지고 있었다. 일단 작업을하면 이전보다 더 적은 결과를 반환했다. – zoydbot

+0

일단 'GROUP BY'를 없애면 HAVING CLAUSE도 제거해야한다. – aefxx