Mysql 如何使第二个表中的两个条目成为第一个表中select查询的两列?
我想要两个显示第二个表“e_value”的结果,其中只有一列中的两条记录,作为第一个表“e_order_item”中select查询的两列。 我还使用参数“collect_id”显示了许多订单项, 因此,我希望使用select查询上显示的订单项id来显示表“e_值”的每两个值 例如,我把这个放在桌子上Mysql 如何使第二个表中的两个条目成为第一个表中select查询的两列?,mysql,Mysql,我想要两个显示第二个表“e_value”的结果,其中只有一列中的两条记录,作为第一个表“e_order_item”中select查询的两列。 我还使用参数“collect_id”显示了许多订单项, 因此,我希望使用select查询上显示的订单项id来显示表“e_值”的每两个值 例如,我把这个放在桌子上 +-------------------------------+ | e_order_item | +-----------------------------
+-------------------------------+
| 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我已经给了你解决方案,请检查它是否让你满意。。。