2016-06-13 4 views
0

저는 화학 분석을 저장하기 위해 mysql을 사용하고 있습니다. 그리고 html/php로 결과를 필터링하고 원하는 결과를 가져 오기 위해 쿼리를 생성합니다. 이제는 복잡한 일이 생기고 모든 필터를 적용하기 위해 자체 조인을 시도하고 있습니다.여러 조건과 자체 결합

내 테이블 디자인은 50 만 개가 넘는 행이있는 것과 같습니다.

+--------+---------+-------------+----------------+ 
| Column | Type | Index |    | 
+--------+---------+-------------+----------------+ 
| RID | int  | primary_key | auto increment | 
| ID  | int  | index  |    | 
| Type | int  |    |    | 
| Order | int  |    |    | 
| Num | int  |    |    | 
| Val1 | decimal |    |    | 
| Val2 | decimal |    |    | 
+--------+---------+-------------+----------------+ 

모든 샘플 유형와 상이한 순서 ID를 갖는다. Val1Val2의 결과입니다. 타입의 분석 결과입니다. 지금까지 42 개의 다른 Num이 있습니다.

예를 들어

내 필터가 그런 경우

Select Types (1,3,9) 
Select ANum (0,5) 
Type 1, Num 5 should be bigger than 10 In Val2 
Type 1, Num 5, should be smaller than 30 In Val2 
Type 3, Num 0, should be smaller than 8 In Val1 

나는 결과를 해당 쿼리를 사용하고 있습니다.

SELECT analyse.* FROM analyse 
INNER JOIN 
(SELECT ID FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 < 30) AS a1 ON a1.SID = analyse.SID 
INNER JOIN 
(SELECT SID FROM WHERE Type = 1 AND Num = 5 AND Val2 > 10) AS a2 ON a2.SID = analyse.SID 
INNER JOIN 
(SELECT SID FROM analyse WHERE Type = 3 AND Num = 0 AND Val1 > 8) AS a3 ON a2.SID = analyse.SID 
WHERE Type IN (1,3,9) AND Num IN (0,5) ORDER BY ID, Type, Order, Num ASC 

+-----+------+-------+---------------+--------------+--------------+--------------+ 
| ID | Type | Order | Val1[Num[0]] | Val2[Num[0]] | Val1[Num[5]] | Val2[Num[5]] | 
+-----+------+-------+---------------+--------------+--------------+--------------+ 
| ... | ... | ... | ...   | ...   | ...   | ...   | 
| 118 | 1 | 1  | 10.9000  | 2.2083  | 3.5056  | 15.2627  | 
| 118 | 1 | 2  | 9.5000  | 1.9246  | 2.0305  | 11.7049  | 
| 118 | 1 | 3  | 7.9000  | 1.6005  | 2.4274  | 16.6597  | 
| 118 | 2 | 1  | 10.9000  | 2.2083  | 3.5056  | 15.2627  | 
| 118 | 3 | 2  | 20.4000  | 4.1329  | 2.8187  | 22.9676  | 
| 118 | 4 | 3  | 28.3000  | 5.7334  | 2.7094  | 29.6273  | 
| 119 | 1 | 1  | 27.2000  | 6.8635  | 0.5506  | 14.9084  | 
| 119 | 1 | 2  | 25.9000  | 6.5355  | 0.4249  | 10.9550  | 
| 119 | 3 | 1  | 27.2000  | 6.8635  | 0.5506  | 14.9084  | 
| 119 | 3 | 2  | 53.1000  | 13.3989  | 0.4893  | 25.8634  | 
| ... | ... | ... | ...   | ...   | ...   | ...   | 
+-----+------+-------+---------------+--------------+--------------+--------------+ 

원하는 출력은 다음과 같아야합니다. 그러나 다른 Val1 및 Val2 값이 동일한 ID, 동일한 유형이지만 순서가 다르므로 INNER JOIN이 예상대로 작동하지 않습니다. 내 필터보다 항상 더 크고 작은 값이 나타납니다. 그들 중 일부는 결코 보이지 않았다.

죄송합니다. 너무 길면. 나는 정확한 문장이나 구조를 찾을 수 없다. 어떤 충고?

편집 : 죄송합니다. 다른 모든 데이터가 ID로 표시되어야한다는 점을 잊어 버렸습니다. 그래서 내가 조인을 사용하려고합니다.

+0

당신이 구조를 나열하거나 데이터 그것입니다 수 ... 당신은 당신의 where 절에 "STYPE"를 참조합니다. 더구나, 당신은 "ID"기초 당 결과를 찾고 있습니까? 그리고 각 화학 분석은 특정한 순서로 예상됩니다 ??? 조건 1과 같은 조건 2는 조건 3의 조건 2 등에서 발견되어야합니다. 3 가지 기준이 모두 충족되면 ... 원하는 최종 기록입니까? – DRapp

+0

@DRapp 여기에 쿼리를 작성하여 SType이 잘못 작성되었습니다. "유형"입니다. 내가 말했듯이 필터를 통과하는 ID의 모든 데이터가 필요합니다. 예를 들어 "유형 1, 숫자 5, 20보다 작은 val2", 29.62, 22,96의 조건이 여전히 Val2에 표시됩니다. ID가 118 인 필터가 매개 변수를 전달하기 때문에 – tuze

답변

0

동일한 숫자와 유형을 별도의 조인으로 가져 오는 대신 함께 쿼리하는 것과 관련된 문제를 해결했습니다. 그런 식으로 동일한 Num 및 Type에 대한 다른 데이터는 필터를 통과 할 수 없습니다.그 조건

Select Types (1,3,9) 
Select ANum (0,5) 
Type 1, Num 5 should be bigger than 10 In Val2 
Type 1, Num 5, should be smaller than 30 In Val2 
Type 3, Num 0, should be smaller than 8 In Val1 

쿼리이 있어야한다

를 들어

,

SELECT analyse.* FROM analyse 
INNER JOIN 
(SELECT ID FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 < 30 AND Val2 > 10) AS a1 ON a1.SID = analyse.SID 
(SELECT SID FROM analyse WHERE Type = 3 AND Num = 0 AND Val1 > 8) AS a3 ON a2.SID = analyse.SID 
WHERE Type IN (1,3,9) AND Num IN (0,5) ORDER BY ID, Type, Order, Num ASC 
0

그래서 테이블에 귀하의 요구 사항을 평가해야 할 기본적으로 4 가지 CRITERIAS있어

Select Types (1,3,9) 
Select Num (0,5) 
Type 1, Num 5 should be bigger than 10 In Val2 
Type 1, Num 5, should be smaller than 30 In Val2 
Type 3, Num 0, should be smaller than 8 In Val1 

입니다 (유형, NUM은 VAL1, VAL2)

는 "더 나은"솔루션이있을 수도 있지만 (성능면에서 또는 코드 읽기가 더 쉽다는 측면에서) 가장 쉬운 접근법은 수백만 건의 레코드를 처리하지 않는 한 명확한 조건 쌍을 만드는 것입니다.

SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 > 10 
UNION 
SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 < 10 
UNION 
SELECT * FROM analyse WHERE Type = 3 AND Num = 0 AND Val1 < 8 
UNION 
SELECT * FROM analyse WHERE Type = 9 
: "4 명시 적으로"쿼리의 조합이 될 것이라고, 그래서

1.) Type = 1, Num = 5, Val2 > 10 
2.) Type = 1, Num = 5, Val2 < 30 
3.) Type = 3, Num = 0, Val1 < 8 
4.) Type = 9 

: 귀하의 요구 사항 중

, 나는 다음과 같은 행 세트 페치 될 필요가 derrive 것

이 ID로 최종 결과를 필터링하려면, 당신은 단순히 사용할 수 있습니다

SELECT * FROM (
    SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 > 10 
    UNION 
    SELECT * FROM analyse WHERE Type = 1 AND Num = 5 AND Val2 < 10 
    UNION 
    SELECT * FROM analyse WHERE Type = 3 AND Num = 0 AND Val1 < 8 
    UNION 
    SELECT * FROM analyse WHERE Type = 9 
) as tempTable WHERE id = 118 
    ,536,913,632 10
  • 또는 각각의 독립적 인 쿼리에 id를 추가하기 만하면됩니다.
+0

답장을 보내 주셔서 감사합니다. 나는 언급하는 것을 잊었다 고 생각한다. 다른 모든 데이터는 필터링 된 ID로 표시되어야합니다. – tuze

+0

@tuze 내 편집보기 – dognose

+0

고마워, 노력하겠습니다. – tuze