Mysql 如何使第二个表中的两个条目成为第一个表中select查询的两列?

Mysql 如何使第二个表中的两个条目成为第一个表中select查询的两列?,mysql,Mysql,我想要两个显示第二个表“e_value”的结果,其中只有一列中的两条记录,作为第一个表“e_order_item”中select查询的两列。 我还使用参数“collect_id”显示了许多订单项, 因此,我希望使用select查询上显示的订单项id来显示表“e_值”的每两个值 例如,我把这个放在桌子上 +-------------------------------+ | e_order_item | +-----------------------------

我想要两个显示第二个表“e_value”的结果,其中只有一列中的两条记录,作为第一个表“e_order_item”中select查询的两列。 我还使用参数“collect_id”显示了许多订单项, 因此,我希望使用select查询上显示的订单项id来显示表“e_值”的每两个值

例如,我把这个放在桌子上

+-------------------------------+
|         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   |
+----------------------------+
我想选择collect\u id=2的订单项目,结果如下

+--------------------------------------------------+
|                                                  |
+--------------------------------------------------+
|                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     |
|                                                  |
+--------------------------------------------------+
问题是:

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;
注:

下面的示例说明了如何从逗号分隔的字符串中获取第一个字符串和第二个字符串

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
结果:

问题是:

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;
注:

下面的示例说明了如何从逗号分隔的字符串中获取第一个字符串和第二个字符串

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
结果:


你必须进行旋转才能得到想要的结果

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:=@currVal 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;

你必须进行旋转才能得到想要的结果

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:=@currVal 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;

这是测试和运行成功…并给出您想要的输出。。。 有两个子查询: 1.首先将给出collect_id=2的所有结果

2.此查询将在不同的列中显示您的姓名、姓氏和id

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;
为什么我们使用左连接..您可以使用此链接正确理解。。。
如果此解决方案有帮助,请告诉我…

此解决方案已测试并成功运行…并根据需要提供输出。。。 有两个子查询: 1.首先将给出collect_id=2的所有结果

2.此查询将在不同的列中显示您的姓名、姓氏和id

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;
为什么我们使用左连接..您可以使用此链接正确理解。。。
如果此解决方案有帮助,请告诉我……

您是如何实现此目的的?提示:左连接和旋转案例when@user2285831我已经给了你解决方案,请检查它是否让你满意…你试图实现什么?提示:左连接和旋转案例when@user2285831我已经给了你解决方案,请检查它是否让你满意。。。