2012-01-05 3 views
0

IN 연산자를 사용하여 mysql 데이터베이스에 대한 쿼리를 실행하려고합니다. 대신 순서대로 usernum 값을 출력 (outputting)의mysql IN 연산자가 내림차순으로 값을 반환합니다.

SELECT usernum FROM usergroup WHERE emailmain IN ('[email protected]', '[email protected]', '[email protected]') 

쿼리 작품은 내림차순으로하여 출력에 들어갔다. 이메일에 맞춰야하기 때문에 문제가됩니다. 나는 그것이 limit 연산자 또는 ORDER BY emailmain을 사용하여 할 수 있습니다 같아요. 나는 그것을 시도했지만 전자 메일이 데이터베이스에 존재하지 않는다고 가정하면 배열의 메모리 위치와 일치하지 않기 때문에 여전히 작동하지 않습니다.

가장 중요한 것은 데이터베이스에없는 이메일을 알고 있다는 것입니다.

도움이 필요하십니까?

+1

아무 것도 지정하지 않으면 어떤 순서로 예상합니까? "EXPLAIN SELECT ..."구문을 사용하여 데이터베이스에서 데이터를 반환하는 데 사용하는 인덱스를 결정하는 데 도움이 될 수 있습니다. 당신이 지정하지 않으면 - mysql이 당신의 쿼리에 가장 적합한 인덱스를 사용할 것입니다. –

+0

그래, 내가 무슨 생각을했는지 모르겠다. 그것의 늦은 나는 인덱스에 대해 생각하지 않았다. 그러나 나는 아직도 데이터베이스에없는 이메일을 말하지 않는 문제에 직면 해있다. – Trent

+1

이것이 문제가 될 수 있습니다 - 내가하는 것처럼 생각하고 있습니다 - 프로그래머로서 - DBA가 아닙니다 - 99.9999 %의 모든 이메일은 여러분에게 없습니다 - 여러분이 원하는 것에 대해 "설정 이론"을 생각할 필요가 있습니다 - 대략적인 추측 "이 전자 메일 목록은 내 DB에 없습니다."제 제안은 전자 메일의 '테이블'을 만든 다음 왼쪽 조인을 수행하고 NULL을 확인하는 것입니다. –

답변

1

동적으로 IN 문자열을 만드는 경우 쿼리를 실행할 때마다 테이블을 만들 필요가 없습니다. IN 문자열과 같은 방식으로 채워진 인라인보기를 사용할 수 있습니다 (

).
select v.email, u.usernum 
from 
(select '[email protected]' email union select '[email protected]' union select '[email protected]') v 
left join usergroup u on v.email = u.emailmain 
order by v.email 
+0

난 처음에이 문제가 있었어. phpMyAdmin의 데이터 정렬을 latin1_swedish_ci로 변경하면 완벽하게 작동합니다. 도움에 정말 감사드립니다. 감사! – Trent

1

당신은 당신의 순서 정의 ORDER BY FIELD을 사용할 수 있습니다

SELECT usernum 
FROM usergroup 
WHERE emailmain IN ('[email protected]', '[email protected]', '[email protected]') 
ORDER BY FIELD (emailmain, '[email protected]', '[email protected]', '[email protected]') 
+0

나는 시도 그러나 이것은 데이터베이스에없는 이메일을 보여주지는 않습니다. 도움을 주셔서 감사합니다! – Trent

+0

이것은 데이터베이스에 전자 메일을 표시하기위한 것이 아닙니다. 이렇게하면 지정한 순서대로 이메일이 주문됩니다. – JohnP

+0

이것은 문제를 해결하지 못했지만 앞으로는 유용 할 것입니다! 고맙습니다! – Trent

1

IN가 발견하든 위해 다시 올 것이다 ORDER 절 행하지 않고, 모든 결과의 순서에 영향을 미치지 않습니다 in.

제공된 전자 메일 목록의 순서와 결과의 순서를 일치시켜야하는 경우 다음을 시도하십시오.

SELECT usernum 
    FROM usergroup 
    WHERE emailmain IN ('[email protected]', '[email protected]', '[email protected]') 
    ORDER BY FIND_IN_SET(emailmain, "[email protected],[email protected],[email protected]") 

FIND_IN_SET은 쉼표로 구분 된 목록 다만 각 결과에서 두 필드를 반환하고 그들에게 응용 프로그램 측의 상관 관계를 SELECT usernum, emailmain FROM ...을 사용하지만 아마 더 안전 할 것이다 큰 목록으로

에 주어진 문자열의 위치를 ​​반환합니다.

+1

답변을 작성하는 동안 JohnP가 게시 한 [FIELD] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field) 함수에 대해 알지 못했습니다. FIND_IN_SET보다 더 나은 선택 일 것입니다. –

+0

나도 마찬가지입니다. 앞으로 도움이 될 것입니다. 그러나 중요한 이유는 그것이 내가 올바르게 정렬되기 때문에 내가 어떤 전자 메일이 데이터베이스에 없는지 알기 때문입니다. 실행 한 후 mysql_fetch_assoc 값을 가져올 배열을 동일한 설정할. 그러나 데이터베이스에없는 이메일은 표시되지 않습니다. – Trent

+0

아마도 당신이 원하는 것은'SELECT usernum FROM usergroup where emailmain NOT IN '('[email protected] ','[email protected] ','[email protected] ')' –

0

IN 조건을 제공한다고해서 순서를 의미하는 것은 아닙니다.

결과를 주문하려면 검색어 끝에 ORDER BY을 사용하십시오.