2017-10-20 16 views
0

の配列と私は識別子としてカップルとユーザーテーブルを持っている:MySQLの要求、カップル識別子

id | type | name 
---------------- 
15 | 1 | AAA 
16 | 1 | BBB 
15 | 2 | CCC 

私は両方のIDと一致する、リストを取得したいと思います:このように、idtypeタイプします。

私は現在、作品、連結システムを、使用します。

SELECT u.id, 
    u.type, 
    u.name 
FROM user u 
WHERE CONCAT(u.id, '-', u.type) IN ('15-1', '16-1', '17-1', '10-2', '15-2') 

しかし、私はそれはそれを行うための適切な方法であるもの、より良いかもしれない感じていますか?

ありがとうございました!

+0

正直なところ、 – kbball

答えて

1

あなたはこの(a, b) IN ((c,d), (e,f), ....)のように、値の「タプル」上で動作することができmysqlの

with dat as 
(
select 17 id, 1 type, 'AAA' t 
union all 
select 16 id, 1 type, 'BBB' t 
union all 
select 17 id, 2 type, 'CCC' t 
) 
-- end of testing data 
select * 
from dat 
where (id, type) in (
-- query data 
    (17, 1), (16, 1) 
) 
+0

これは私が求めていたものです!ありがとうございました:) –

0

これらを分けることができます。それは、より効率的だが、少なくともあなたは、連結部分を保存するかどうかわからない:

SELECT u.id, 
    u.type, 
    u.name 
FROM user u 
WHERE (u.id = 15 AND u.type = 1) 
OR (u.id = 16 AND u.type = 1) 
OR (u.id = 17 AND u.type = 1) 
OR (u.id = 10 AND u.type = 2) 
OR (u.id = 15 AND u.type = 2) 
+0

私はこの解決策を考えていなかった、ありがとう:) –

0

私はそれはあなたが彼ら場合

をフィルタリングするために使用し、IDと型の値を取得する方法に大きく依存だと思います彼らは一時テーブルに保存され、参加

create TEMPORARY TABLE criteria as 

select 15 as id, 1 as type 
UNION 
select 16 as id, 1 as type 
UNION 
select 17 as id, 1 as type 
UNION 
select 10 as id, 2 as type 
UNION 
select 15 as id, 2 as type 

    SELECT u.id, 
    u.type, 
    u.name 
FROM user u 
    inner join criteria c on u.type = c.type and u.id = c.id 

他のオプションは、内側のクエリで、その後のMySQLの兵器庫にかなり遅れて追加されている(WITH句参加したりして使用することができ、別の計算の結果は、トリック)

+0

面白い、私は一時テーブルについては知りませんでした、ありがとう –

1

INで、次のアプローチを使用することができます。 "a"と "b"のconcat操作を行わずに文字列を比較しているので、この方法を使う方が速くなります。代わりに、処理されていない値と適切な比較演算(常に文字列比較ではない)の値のペアを比較しています。

さらに、「a」および/または「b」が文字列値である場合、連結手法を使用すると、あいまいな結果になる可能性があります。 ( "1-2"、 "3")と( "1"、 "2-3")のペアが同じ結果 "1-2-3"につながっています。

+0

これはまさに私が求めていたものです!ありがとうございました :) –