2016-04-01 12 views
1

İki tabloda 'e_order_item' isimli ilk tablodan seçme sorgusu için iki sütun (iki sütun) olan iki e-tablo olan 'e_value' sonucunu göstermek istiyorum. Ayrıca 'collect_id', parametresini kullanarak birçok sipariş öğesi görüntülüyorum, bu yüzden 'e_value' tablosunun her iki değerini, select sorgusunda görüntülenen sipariş öğesi kimliğini kullanarak görüntülemek istiyorum. örneğinİlk tablodan seçme sorgusu için ikinci tablonun iki girişini iki sütun olarak nasıl yapılır?

, ben

+-------------------------------+ 
|   e_order_item   | 
+-------------------------------+ 
| oi_id oi_price oi_collect_id | 
| 1   100   2  | 
| 2   30   2  | 
| 3   55   3  | 
| 4   70   4  | 
| 5   220   2  | 
| 6   300   2  | 
+-------------------------------+ 

+----------------------------+ 
|   e_value   | 
+----------------------------+ 
| v_id v_value  v_oi_id | 
| 1  name1   1 | 
| 2  surname1  1 | 
| 3  name2   2 | 
| 4  surname2  2 | 
| 5  name3   5 | 
| 6  surname3  5 | 
+----------------------------+ 

I = 2 collect_id gelmiş ORDER_ITEMS seçmek istiyorum, ve sonuç bu

+--------------------------------------------------+ 
|             | 
+--------------------------------------------------+ 
|    Result       | 
| oi_id oi_price oi_collect_id name surname | 
| 1   100   2   name1 surname1 | 
| 2   30   2   name2 surname2 | 
| 5   220   2   name3 surname3 | 
| 6   300   2   null null  | 
|             | 
+--------------------------------------------------+ 
+0

: bizim istenen sonucu almak Bunu başarmaya çalıştın mı? İpucu: 'LEFT JOIN' &' Pivoting (Case when) ' – 1000111

+0

@ user2285831 Size çözüm sunduğumuzu lütfen sorun olup olmadığını kontrol edin ... – Shiv

cevap

0

gibi olmak istiyorum İşte tablolarda bu var sorgu:

SELECT 
    t.oi_id, 
    t.oi_price, 
    t.oi_collect_id, 
    LEFT (
     GROUP_CONCAT(t.v_value), 
     IF (
       LOCATE(',',GROUP_CONCAT(t.v_value)) = 0, 
       LENGTH(GROUP_CONCAT(t.v_value)), 
       LOCATE(',', GROUP_CONCAT(t.v_value)) - 1 
      ) 
    ) 'Name', 
    RIGHT (
     GROUP_CONCAT(t.v_value), 
     LENGTH(GROUP_CONCAT(t.v_value)) - 
    IF (
      LOCATE(',',GROUP_CONCAT(t.v_value)) = 0, 
      LENGTH(GROUP_CONCAT(t.v_value)), 
      LOCATE(',',GROUP_CONCAT(t.v_value)) 
     ) 
    ) Surname 
FROM 
    (
     SELECT 
      * 
     FROM e_order_item 
     LEFT JOIN e_value ON e_order_item.oi_id = e_value.v_oi_id 
     WHERE e_order_item.oi_collect_id = 2 
     ORDER BY oi_id, v_id 
    ) t 
GROUP BY t.oi_id; 

DEMO HERE

Not:

Aşağıdaki örnek bir virgülle ayrılmış dizesinden birinci dize ve ikinci dize nasıl alabilirim göstermektedir.

SET @str := 'A,BCDEFGHIJKL'; 
SELECT 
LEFT(@str,IF(LOCATE(',',@str) = 0, LENGTH(@str),LOCATE(',',@str)-1)) AS StringBeforeComma, 
RIGHT(@str,LENGTH(@str)-IF(LOCATE(',',@str)=0,LENGTH(@str),LOCATE(',',@str))) AS StringAfterComma 

Sonuç: Sen istenilen sonucu elde etmek için eksen etrafında dönmek için gitmek zorunda

StringBeforeComma  StringAfterComma 

    A     BCDEFGHIJKL 
0

.

select oi_id, oi_price, oi_collect_id 
    , max(name) as name 
    , max(surname) as surname 
    from (
    select 
      i.oi_id, i.oi_price, i.oi_collect_id 
     , case when @prevVal <> (@currVal:=v.v_oi_id) 
        then v.v_value 
       else null 
      end as name 
     , case when @prevVal = @currVal 
        then v.v_value 
       else null 
      end as surname 
     , @prevVal:[email protected] as temp_currVal 
     from e_order_item i 
     left join e_value v on v.v_oi_id = i.oi_id, 
     (select @prevVal:=-1, @currVal:=-1) as inits 
    where i.oi_collect_id=2 
) as main_data 
group by oi_id, oi_price, oi_collect_id 
order by 1; 
0

Bu test edilmiş ve başarıyla çalıştırmak ... ve istediğiniz gibi çıktı vermek olduğunu ... iki alt sorgular vardır:
1.First tüm sonuç collect_id = 2 sahip verecek ...

1.SELECT tab1.oi_id, tab1.oi_price, tab1.oi_collect_id 
from(
    SELECT oi_id, oi_price, oi_collect_id 
    from e_order_item 
    where oi_collect_id = 2 
) as tab1; 

2.This sorgu

2.(SELECT e.v_value as name, surname, id 
    from (
     select t1.v_value as surname, t1.v_oi_id as id from e_value as t1 
     group by t1.v_oi_id 
    )join e_value as e on id = e.v_oi_id and surname <> e.v_value 
) as tab2 on tab1.oi_id = tab2.id; 
Şimdi

left join bu iki sorgu için .. farklı sütunlarda size ad, soyad ve kimliği verecektir

SELECT tab1.oi_id, tab1.oi_price, tab1.oi_collect_id, name, surname 
from(
    SELECT oi_id, oi_price, oi_collect_id 
    from e_order_item 
    where oi_collect_id = 2 
) as tab1 left join 

(SELECT e.v_value as name, surname, id 
    from (
     select t1.v_value as surname, t1.v_oi_id as id from e_value as t1 
     group by t1.v_oi_id 
    )join e_value as e on id = e.v_oi_id and surname <> e.v_value 

) as tab2 on tab1.oi_id = tab2.id 

order by tab1.oi_id asc; // to print in ascending order.. 

Neden ..sen sonra bana bildirin bu çözüm yararlı ise ... düzgün anlamak için bu linki http://www.w3schools.com/sql/sql_join_left.asp kullanabilirsiniz left join kullanmak ne var ...

İlgili konular