2012-08-14 4 views
1

PHP 웹 인터페이스가있는 작은 서점을위한 데이터베이스를 구축하고 있습니다. 이 문제를 위해 'sales'테이블 (inc_core)의 'description'필드와 동일한 'barcode'필드에 값이있는 'products'테이블 (prod_core)의 모든 레코드를 표시하려고합니다.SELECT를 올바르게 사용하지 마십시오

첫 번째 '판매'돌연변이에 대해 실제로이 작업을 수행 할 수 있었지만 '영업'테이블에 두 번째 레코드를 추가 할 때마다 쿼리가 더 이상 작동하지 않습니다. (추가 된 첫 번째 레코드 제외). 나는 그것이 SQL이 반복되지 함께 할 수있는 뭔가 (가 요구 사항을 충족 기록을 위해 테이블을 검색 중지)하지만 난 확실하지 않다가 있다고 가정

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, 
     prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE prod_core.barcode NOT IN (
     SELECT `description` 
     FROM inc_core 
     GROUP BY prod_core.prodID)

: 이것은 내 SQL 코드입니다. 어떤 도움을 주셔서 감사합니다!

+0

구문 분석해서는 안되는 것처럼 보입니다. '설명'이 목록별로 그룹에 없습니다. –

+0

@WalterMitty. . . 그것은 mysql의 "기능"이다. google에서 "mysql 숨겨진 열"을 찾으십시오. –

답변

3

은 내가 LEFT JOIN 대신 NOT IN의를 제안 : 당신의 SELECT 문에서 열 아무도 집계 함수의 일부가 없기 때문에

SELECT 
    prod_core.prodID, 
    prod_core.title, 
    prod_core.location, 
    prod_core.genre, 
    prod_core.price, 
    prod_core.barcode 
FROM 
    prod_core 
    LEFT JOIN inc_core ON inc_core.`description` = prod_core.barcode 
WHERE 
    inc_core.`description` IS NULL 

또한, 나는 GROUP BY 을 제거하고 DISTINCT로 교체. .. 그러나, 나는이 테이블이 왜 중복을 포함해야하는지 알지 못한다.

EDIT : 내가 잘못된 검색어를 입력했는데 group by이 외부 쿼리에 있었지만 하위 쿼리에는 +1이 없었습니다.

+0

감사합니다. Michael Fredrickson! 당신은 단 1 분 만에 작은 문제를 해결할 수 있었고, 하루 종일이 문제에 허리를 돌리고있었습니다 ...이 웹 사이트는 대단합니다. 다시 한 번 감사드립니다! –

+0

@GeoffreyBergman 여러분, 반갑습니다. 이것이 귀하의 질문에 답변 한 경우 [수락 된 답변으로 표시하십시오] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). –

+0

그냥 했어! 8 분을 기다려야했다. –

1

나는 당신이 사용할 수 있어야 있도록, GROUP BY 절을 필요가 있다고 생각하지 않습니다

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core) 
2

쿼리가있는 문제는 하나 개의 필드에 의해,하지만 당신이 선택하는하여 그룹 다른. 즉, 하위 쿼리가 각 제품에 대한 임의의 설명을 선택하고 있음을 의미합니다. 기대하는 전체 목록을 얻고 있다고 보장 할 수는 없습니다.

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, 
     prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core) 

그러나, 이것은 비효율적 일 가능성이 높습니다 :

이 문제를 해결하는 가장 쉬운 방법으로 그룹을 제거하는 것입니다. 하위 쿼리가있는 "in"의 경우 최상의 최적화는 exist를 사용하는 것입니다. 또한 설명에 색인이 있는지 확인하십시오. 여기에 구체적으로 MySQL을위한 대안 버전 : 개인적으로

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, 
     prod_core.price, prod_core.barcode 
FROM prod_core 
WHERE not exists (select 1 from inc_core where inc_core.description = prod_core.barcode) 

, 나는 "에서"대체와 상관 하위 쿼리의 큰 팬이 아니에요. 그러나, 이것은 mysql에 의해 가장 최적화 된 접근법이다.

관련 문제