PHP MySQL 获取两张表的数据,第二张表的数据等于第一张表的某个键的值
目前渲染的数据格式是:array("id"=>1,"title"=>"string","content"=>"string","advantage"=>array(),"...
目前渲染的数据格式是:
array(
"id" => 1,
"title" => "string",
"content" =>"string",
"advantage" =>array(),
"features" =>array(),
"process" =>array()
);
第一张表的数据格式:
array(
"id" => 1,
"title" => "string",
"content" =>"string",
"advantage" =>"advantage",
"features" =>"features",
"process" =>"process"
);
这里的advantage/features/process对应第二张表的type,因这里是一个二维数组。这里的ID为主键,第二张表的with_id对应第一张表的主键ID。
第二张表的数据格式:
array(
"id" => 1,
"with_id" =>1,
"type" =>"advantage(或)features(或)process"
"title" => "string",
"content" =>"string"
);
看了join的用法,若第一张表的数据仅一条,那么获取出来的数据变成10多条了,而更改数据格式,循环遍历出来的数据type又对等不上第一张表的数据。
想问问大神,如果是这样的数据,该如何获取到?如果数据这样排列麻烦效率不高,那么有更高效率的方法吗?
现在我写出来的数据是直接在方法里面获取两次MySQL数据,然后遍历循环出来,把格式修改成渲染数据格式,但总归麻烦。 展开
array(
"id" => 1,
"title" => "string",
"content" =>"string",
"advantage" =>array(),
"features" =>array(),
"process" =>array()
);
第一张表的数据格式:
array(
"id" => 1,
"title" => "string",
"content" =>"string",
"advantage" =>"advantage",
"features" =>"features",
"process" =>"process"
);
这里的advantage/features/process对应第二张表的type,因这里是一个二维数组。这里的ID为主键,第二张表的with_id对应第一张表的主键ID。
第二张表的数据格式:
array(
"id" => 1,
"with_id" =>1,
"type" =>"advantage(或)features(或)process"
"title" => "string",
"content" =>"string"
);
看了join的用法,若第一张表的数据仅一条,那么获取出来的数据变成10多条了,而更改数据格式,循环遍历出来的数据type又对等不上第一张表的数据。
想问问大神,如果是这样的数据,该如何获取到?如果数据这样排列麻烦效率不高,那么有更高效率的方法吗?
现在我写出来的数据是直接在方法里面获取两次MySQL数据,然后遍历循环出来,把格式修改成渲染数据格式,但总归麻烦。 展开
2个回答
2018-09-12
展开全部
update a inner join b on a.bid=b.id set a.x=b.x,a.y=b.y ;
这里使用了case when 这个小技巧来实现批量更新。
举个例子:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 ENDWHERE id IN (1,2,3)
这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
如果更新多个值的话,只需要稍加修改:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' WHEN 2 THEN 'New Title 2' WHEN 3 THEN 'New Title 3' ENDWHERE id IN (1,2,3)
到这里,已经完成一条mysql语句更新多条记录了。
但是要在业务中运用,需要结合服务端语言,这里以php为例,构造这条mysql语句:$display_order = array( 1 => 4, 2 => 1, 3 => 2, 4 => 3, 5 => 9, 6 => 5, 7 => 8, 8 => 9);$ids = implode(',', array_keys($display_order));$sql = "UPDATE categories SET display_order = CASE id ";foreach ($display_order as $id => $ordinal) { $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);}$sql .= "END WHERE id IN ($ids)";echo $sql;
这里使用了case when 这个小技巧来实现批量更新。
举个例子:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 ENDWHERE id IN (1,2,3)
这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
如果更新多个值的话,只需要稍加修改:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' WHEN 2 THEN 'New Title 2' WHEN 3 THEN 'New Title 3' ENDWHERE id IN (1,2,3)
到这里,已经完成一条mysql语句更新多条记录了。
但是要在业务中运用,需要结合服务端语言,这里以php为例,构造这条mysql语句:$display_order = array( 1 => 4, 2 => 1, 3 => 2, 4 => 3, 5 => 9, 6 => 5, 7 => 8, 8 => 9);$ids = implode(',', array_keys($display_order));$sql = "UPDATE categories SET display_order = CASE id ";foreach ($display_order as $id => $ordinal) { $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);}$sql .= "END WHERE id IN ($ids)";echo $sql;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不是太明白你的意思
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询