2012-01-06 3 views
1

나는 이상한 일을한다. 이것은 아마도 이상한 쿼리를 의미 할 것이다. 기본적으로 내가 지금까지있는 것은이 잘 작동,하지만 난이 쿼리를 변경하려는MySQL IN 절 특수 쿼리

SELECT * FROM locations WHERE name IN ('city1','city2','country1','city3'); 

. 어떤 식 으로든 city1country1으로 그룹화하려는 경우, 그 중 하나가 행을 반환하면 (쿼리의 유효한 선택자 임) 다른 하나는 더 이상 실행하지 않아야합니다. 이 쿼리가 작동하지만 city2city3 포함 된 값을 반환, 내가 원하지 않는 것을

SELECT * FROM locations WHERE name IN (('city1' OR 'country1'),'city2','city3'); 

:처럼 뭔가.

이와 비슷한 것이 가능합니까?

편집 : 더 구체적으로 예를 들면 다음과 같습니다.

array('Bucharest', 'Romania') 
array('New York') 
array('Barcelona', 'Spain') 
:

Bucharest, Romania New York Barcelona, Spain

는 이러한 배열의 3 개 세트가 될 것이다 :

나는 (PHP)에, 나는 5에 침입거야 3 개 위치를 가지고

각 지역의 대륙을 조회하고 싶습니다. MySQL에서 IN 절을 사용하여 동일한 쿼리에서 이들 모두를 검색 할 것입니다. 쿼리를 3 행 반환하려면 : Europe, North America, Europe.

그러나 테이블에 없기 때문에 내 검색어에서 Bucharest에 대한 항목을 찾을 수 없으므로 배열의 다음 단어를 검색하고 싶습니다. Romania.

희망 사항이 문제를 해결합니다.

+0

이 나에게 의미를하지 않는 것 같습니다. 결과는 부울입니다. 둘의 차이점은 무엇입니까? –

+1

약간의 샘플 데이터를 포함하면 도움이 될 수 있습니다. 당신이 무엇을하려고하는지 완전히 모르겠습니다. –

+0

''1 ','2 ','3 ','4 '와 같이 이름이'1 '이거나 이름이'2 '이거나 이름이'3 '이거나 이름이'4 ' . 당신은 정확히 무엇을 달성하기를 원합니 까? – Matten

답변

2

나는이 최선의 해결책이라고 생각하지 않지만, 당신이 이런 식으로 그것을 달성 할 수 있다고 생각 : 모든 "비 분류"이름을 선택하고 초 만 첫 번째 행을 선택합니다

SELECT * FROM locations WHERE name IN ('city2','city3') 
UNION 
(SELECT * FROM locations WHERE name IN ('city1','country1') LIMIT 1) 

(그렇지 없다, 또는 아무것도 경우는 "COUNTRY1"일치 또는 않다면 그것은 "city1"입니다)하지만 당신이 원하는 경우가 더 일반적으로, 그것은 내가 :)

+0

이것은 'LIMIT 1'이후까지 두 번째 선택에서 대괄호가 필요하다는 언급과 함께 작동합니다. 그렇지 않으면 이것이 내가 원하는 것입니다. 2 개의 선택보다 더 나은 솔루션이 있기를 바랍니다 (약 2,000 개의 값을 찾고 싶습니다). 더 좋은 대답이 나오지 않는다면, 나는 이것을 올바른 것으로 표시 할 것입니다. 매우 감사합니다! –

+0

고마워, 지금은 고쳐 졌어. :) – boobiq

0

생각 어떻게 든 다른 수행해야합니다 선택하여 문제는 귀하의 테이블이 너무 일반적이라는 것입니다 - 당신은 두 개의 별개의 실체 (도시와 국가) 하나의 테이블에 저장 됨.

당신이 도시를 선택하려는 그들의 국가가 왼쪽 사용하면 데이터가 보인다면

SELECT cities.name, countries.name 
FROM cities LEFT JOIN countries ON countries.id = cities.country_id 

에 가입하면 정말 그런

CREATE TABLE countries (id, name); 
CREATE TABLE cities (id, name, country_id); 

에 데이터베이스 구조를 변경하기 위해 조언을 것 같은 :

-- countries 
id, name 
1, Romania 
2, Spain 

-- cities 
id, country_id, name 
1, 1,  , Bucharest 
2, 2,  , Barcelona 
3, NULL,  , New York 

위 쿼리는 원하는 내용을 정확히 반환합니다.

Bucharest, Romania 
Barcelona, Spain 
New York, NULL 
+0

나는이 구조를 가지고있다 (중요하지 않다고 생각했다). 그러나 쿼리에 조건을 추가하여 전체 결과를 엉망으로 만들고 싶습니다. –

0
SELECT inputdata.city, inputdata.country, l.continent_id from 
    (
    select 'city1' city, 'country1' country from dual 
    union all 
    select 'city2' city, null country from dual 
    union all 
    select 'city2' city, null country from dual 
) inputdata 
join locations l 
on l.name = inputdata.city or l.name = inputdata.country 
group by inputdata.city, inputdata.country 

당신은 PHP에서 내부 쿼리를 생성한다 ...