2012-01-05 9 views
0

IN演算子を使用してmysqlデータベースからクエリを実行しようとしています。mysql IN演算子は降順で値を返します

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

クエリが動作しますが、代わりに順番にusernum値をoutputingのは、それが多い順に出力入りました。これは私が電子メールに合わせるために必要なので問題です。私はそれが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

:それは、[1] 参考になりますこれは私にはデータベースにない電子メールを表示しません。しかし、助けてくれてありがとう! – 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を使用してください。