2016-09-01 7 views
0

私は2つのテーブル(champ_valueとchamp_form)を持っているが、私は2つのクエリを試してみましたが、私は私が望む結果を得られなかった、希望の結果を得るために私のクエリを変更する方法は?

あなたは、他のソリューションに私に事前に

感謝を与えることができますしてください。

+-------------+-----------+---------------------+---------------+ 
| champ value |   |      |    | 
|    |   |      |    | 
| v_id  | v_value | v_fk_order_item_id | v_fk_champ_id | 
| 220   | Bernad | 20000    | 1    | 
| 221   | Lagaf  | 20000    | 2    | 
| 500   | Vincent | 20000    | 1    | 
| 501   | Pernault | 20000    | 2    | 
+-------------+-----------+---------------------+---------------+ 


+------------+-------------+---------------+-------------+ 
| champ_form |    |    |    | 
| cf_id  | cf_position | cf_fk_form_id | cf_champ_id | 
| 330  | 10   | 1800   | 1   | 
| 331  | 12   | 1800   | 2   | 
| 630  | 13   | 1800   | 1   | 
| 631  | 14   | 1800   | 2   | 
+------------+-------------+---------------+-------------+ 

所望の結果は次のようになり:

+----------------+-------+-------------+-------------+----------+ 
| desired result |  |    |    |   | 
|    |  |    |    |   | 
| v_id   | cf_id | cf_position | cf_champ_id | v_value | 
| 220   | 330 | 10   | 1   | Bernard | 
| 221   | 331 | 12   | 2   | Lagaf | 
| 500   | 630 | 13   | 1   | Vincent | 
| 501   | 631 | 14   | 2   | Pernault | 
+----------------+-------+-------------+-------------+----------+ 

私はこの最初のクエリを試みた:

SELECT v.v_id, cf.cf_id, cf.cf_position, cf.cf_champ_id, v.v_value 
FROM champ_form cf 
JOIN champ_value v ON v.v_fk_champ_id = cf.cf_champ_id 
WHERE cf.cf_fk_form_id =1800 
AND v.v_fk_order_item_id =20000 
GROUP BY v_id 
ORDER BY cf.cf_position 

を、私はこれを得る:

+---------------+-------+-------------+-------------+----------+ 
| group by v_id |  |    |    |   | 
|    |  |    |    |   | 
| v_id   | cf_id | cf_position | cf_champ_id | v_value | 
| 220   | 330 | 10   | 1   | Bernard | 
| 221   | 330 | 10   | 1   | Vincent | 
| 500   | 331 | 12   | 2   | Lagaf | 
| 501   | 331 | 12   | 2   | Pernault | 
+---------------+-------+-------------+-------------+----------+ 

及び第二クエリ:

SELECT v.v_id, cf.cf_id, cf.cf_position, cf.cf_champ_id, v.v_value 
    FROM champ_form cf 
    JOIN champ_value v ON v.v_fk_champ_id = cf.cf_champ_id 
    WHERE cf.cf_fk_form_id =1800 
    AND v.v_fk_order_item_id =20000 
    GROUP BY cf.cf_id 
    ORDER BY cf.cf_position 

+----------------+-------+-------------+-------------+---------+ 
| group by cf_id |  |    |    |   | 
|    |  |    |    |   | 
| v_id   | cf_id | cf_position | cf_champ_id | v_value | 
| 220   | 330 | 10   | 1   | Bernard | 
| 221   | 331 | 12   | 2   | Lagaf | 
| 220   | 630 | 13   | 1   | Bernard | 
| 221   | 631 | 14   | 2   | Lagaf | 
+----------------+-------+-------------+-------------+---------+ 

最初のクエリは正しい値を示しますが、正しい位置は ではなく、2番目の値は正しい値ですが、正しい値は与えません。

+0

望ましい行動が何であるかを言葉で説明してください。 –

+0

期待する出力はありますか? – Sadikhasan

+0

これは、GROUP BY句がSELECTされた値に対応していないために発生します。 MySQL以外のほとんどのデータベースでは、この予期しない動作を防ぐためにエラーが発生します。 –

答えて

0

希望の動作を記述することなく、あなたが望むものを理解するのが難しいです。しかしおそらく問題は選択された列がGROUP BYにないことです。

SELECT aa.v_id, cc.cf_id, cc.cf_position, cc.cf_champ_id, aa.v_value 
FROM champ_value AS aa 
INNER JOIN (
    SELECT _aa.v_id 
    FROM champ_value AS _aa 
    INNER JOIN champ_form AS _bb 
    ON _aa.v_fk_champ_id = _bb.cf_champ_id 
    WHERE _aa.cf_fk_form_id = 1800 AND _bb.v_fk_order_item_id = 20000 
    GROUP BY _aa.v_id 
) AS bb 
ON aa.v_id = bb.v_id 
INNER JOIN champ_form AS cc 
ON aa.v_fk_champ_id = cc.cf_champ_id 
ORDER BY aa.cf_position 

詳細情報herehere

は、次の試してみてください。

+0

ありがとうKostas、 実行するクエリを変更しますが、googの結果を返しませんでした – user2285831

+0

SELECT aa.v_id、cc.cf_id、cc.cf_position、 cc.cf_champ_id、AA 内部結合AS champ_value FROM aa.v_value は( SELECTは_aa.v_fk_champ_id = _bb.cf_champ_id WHERE _bb.cf_fk_formulaire_id = 1849 AND _aa ON _bb AS _aa INNER JOIN champ_form AS champ_value FROM を_aa.v_id .v_fk_order_item_id = 20319 GROUP BY _aa.v_id )AS bb ON aa.v_id = bb.v_id INNER JOIN champ_form AS cc ON aa.v_fk_champ_id = cc.cf_champ_id ORDER BY cc.cf_position – user2285831

0

これは位置によって表示されますが、それでも安全だとは思われません。
/*

create table champ_value (v_id int,  v_value varchar(10), v_fk_order_item_id int, v_fk_champ_id int); 
truncate table champ_value; 
insert into champ_value values 
(220   , 'Bernad' , 20000    , 1   ), 
(221   , 'Lagaf'  , 20000    , 2   ), 
(500   , 'Vincent' , 20000    , 1   ), 
(501   , 'Pernault' , 20000    , 2   ); 
create table champ_form(cf_id int,cf_position int, cf_fk_form_id int ,cf_champ_id int); 
insert into champ_form values 
(330  , 10   , 1800   , 1   ), 
(331  , 12   , 1800   , 2   ), 
(630  , 13   , 1800   , 1   ), 
(631  , 14   , 1800   , 2   ); 

+----------------+-------+-------------+-------------+----------+ 
| desired result |  |    |    |   | 
|    |  |    |    |   | 
| v_id   | cf_id | cf_position | cf_champ_id | v_value | 
| 220   | 330 | 10   | 1   | Bernard | 
| 221   | 331 | 12   | 2   | Lagaf | 
| 500   | 630 | 13   | 1   | Vincent | 
| 501   | 631 | 14   | 2   | Pernault | 
+----------------+-------+-------------+-------------+----------+ 

*/ 

SELECT s.v_id,t.cf_id, t.cf_position ,t.cf_champ_id ,s.v_value 
FROM 
(
SELECT I.v_id,v_value,v_fk_order_item_id,v_fk_champ_id, 
      @RN:[email protected] + 1 RN 
FROM  (SELECT @RN:=0) RN,champ_value I 
order  by i.v_id asc 
) S 
LEFT OUTER JOIN 
(SELECT cf_id,cf_position, cf_fk_form_id,cf_champ_id, 
      @RN1:[email protected] + 1 RN1 
FROM  (SELECT @RN1:=0) RN1, champ_form E 
order  by e.cf_id asc 
) T ON T.RN1 = S.RN 

の実績

+------+-------+-------------+-------------+----------+ 
| v_id | cf_id | cf_position | cf_champ_id | v_value | 
+------+-------+-------------+-------------+----------+ 
| 220 | 330 |   10 |   1 | Bernad | 
| 221 | 331 |   12 |   2 | Lagaf | 
| 500 | 630 |   13 |   1 | Vincent | 
| 501 | 631 |   14 |   2 | Pernault | 
+------+-------+-------------+-------------+----------+ 
関連する問題