2010-12-09 4 views
1

이 내 첫 번째 질문, 그래서 내가 (그 너무 오래하지 희망!) 내가 시도하는 MySQL과 PHP를 사용하고MySQL을 (그리고 PHP) 단일 쿼리, 단일 테이블, 여러 규정

을 명확하게하기 위해 노력하고 대략 다음과 같은 구조로 판매 데이터의 MySQL 테이블에서 시작된 php 테이블의 데이터를 비교합니다 (데이터는 여러 위치에서 여러 제품을 사고 팔았 음을 나타냄).

price 
quantity 
type 
buyflag 
location 

'buyflag는'부울하고 기록 가격이 항목을 구입 또는 판매되고있는 가격인지 여부를 나타냅니다 buyflag = 사실은 항목과 buyflag 구입 한 가격 = 거짓이 표시입니다 제품이 판매 된 가격.

첫 번째 위치에서 제품을 구입하고 두 번째 위치에서 판매 할 때 각 제품 유형별로 두 위치를 비교하는 쿼리 결과가 필요합니다.

'buyprice이'가 위치 1 'sellprice'에서 구입 한 가격은
type | quantity | 'buyprice' | 'sellprice' 

은 몇 가지 조사 후 위치 2

에 판매 된 가격은 다음과 같습니다 즉,이 같이 보입니다 조인과 하위 쿼리를 사용하여 다른 결과를 표시 할 수 있었지만 데이터가 모두 단일 테이블에 있지만 두 개의 WHERE 문이 필요할 때이 특정 쿼리의 마지막 두 열을 쿼리하는 방법으로이 경우에 난처한 상황에 처했습니다. 그것을 파헤쳐 라.

select type, quantity, max(price) as buyprice 
from marketfile 
where (buyflag=true and location=102) 
group by type; 

은 처음 3 열을 얻을 것이다, 또는

select type, quantity, min(price) as sellprice 
from marketfile 
where (buyflag=false and location=75) 
group by type; 

는 제 1, 제 2, 제 4 열을 얻을 것이다하지만 난 한 쿼리에서 모든 것을 얻을 방법을 알아낼 수 없습니다.

내 오히려 가난한 하위 쿼리의 노력 (실패)는 지금까지이었다

select type, quantity, min(price) as buyprice, 
(select max(price) from marketfile where (buyflag=false and location=75)) as sellprice 
from marketfile 
where (buyflag=true and location=102) 
group by type; 

나는 하나의 쿼리에서 그것을하고 싶은 이유는 다음 내가 볼 수있는 테이블로 쿼리를 표시하기 위해 PHP를 사용하는 것입니다 위치 1에서 구입하고 위치 2에서 판매되는 수백 가지 항목 목록을 내리고이 특정 경로의 제품 여백을 살펴보십시오.

위의 두 가지 별도의 쿼리를 사용하여이를 새 테이블로 덤프 한 다음 해당 테이블을 다시 쿼리하면 MySQL의 부적절 함을 해결할 수 있습니다. 이 해결 방법은 여러 위치에서 작업하기 때문에 기하 급수적으로 늘어나는 경로 (따라서 작업 할 테이블)를 늘리고 싶을 때 특히 훌륭하게 보입니다.

미리 도움을 청하십시오.

+0

검색어에 코드 태그 ('101 010'이 표시된 작은 버튼)를 추가하면 질문을 훨씬 쉽게 읽을 수 있습니다. – LittleBobbyTables

+0

LittleBobbyTables 감사합니다. – lillebusy

답변

0

올바르게 이해하면 marketfile 테이블의 두 행을 하나의 출력 행으로 결합해야합니다. 이를 달성하기 위해서는 테이블 자체에 가입해야합니다. 당신은 FROM 절에 두 번 퍼팅하고 별칭 제공하여 작업을 수행 할 수 있습니다

SELECT a.type, … 
FROM marketfile as a, marketfile as b 
WHERE (a.type = b.type) AND (a.location = 102) AND (b.location = 75) AND … 

에만 해당 레코드를 선택하기 위해 WHERE 절에 필요한 모든 조건을 가입 넣어해야합니다. 그렇지 않으면 쿼리가 영원히 끝나고 너무 많은 결과를 반환합니다.

+0

여행 부탁드립니다.당신이 제공 한 대답은 내가 필요한 것입니다. 테이블에 별칭을 사용하여 테이블을 조인하고 각 별칭에 다른 WHERE 제한을 지정할 수 있다는 것을 알지 못했습니다. 이 정보를 내 쿼리에 통합하면 게이트 밖에서 올바르게 작동하는 것 같습니다. 나는 아직 새로운 일로 인해 명성을 높일 수는 없지만, 그렇게 할 수있을 때까지 다른 누군가가 대신 할 것입니다. – lillebusy

+0

도움이 될만한 사람들에게, travelboy의 대답을 기반으로 한 결과 쿼리는 다음과 같이 보입니다. – lillebusy

+0

그것이 효과가있어 기쁩니다! 나는 몇 년 전에 똑같은 도전을했고, 영원히 수색했으며, 마침내 그 해결책이 너무 쉽다는 사실에 놀라움을 금치 못했다. 나는 새로운 점도 알고있다. 나는 _accepting_ 대답 (추청하지 않음)이 최소한의 평판을 요구하지 않는다고 생각합니다. – travelboy