2016-04-20 30 views
0
+------------------------------------+ 
| uid  | user_name | food | 
+-----------------------------------+ 
| 12345  | Joe   | 3,1,2 | 
| 12346  | John  | 2,1  | 
| 12347  | David  | 30,2,1 | 
| 12355  | Peter  | 50,1 | 
+-----------------------------------+ 


+-------------------------+ 
| food_id | food_name | 
+------------------------+ 
| 1  | apple  | 
| 2  | orange  | 
| 3  | banana  | 
| 50  | pear  | 
+------------------------+ 

$user_sql = "SELECT `uid`,`user_name`,`food` FROM `user`"; 
$stmt = $pdo->prepare($user_sql); 
$stmt->execute(); 
$user_data = $stmt->fetchAll(PDO::FETCH_ASSOC); 

$food_id = $user_data["food"]; // will be get eg: 50,1,3 
$food_sql = "SELECT * FROM `food` WHERE `food_id` in ($food_id)"; 
$stmt = $pdo->prepare($food_sql); 
$stmt->execute(); 
$food_data = $stmt->fetchAll(PDO::FETCH_ASSOC); 

我会foreach $ food_data。php + mysql两个表格排序

没关系,可以显示它。

但是这个数组($ food_data)是按food排序的顺序。 food_id,我需要排序相同userfood

EG显示:

乔 - 苹果,橘子,香蕉(默认排序food_id 1,2,3)

约翰 - 苹果,橘子(违约food_id 1,2排序)

大卫 - 苹果,橘子,梨(违约food_id 1,2,50排序)

彼得 - 苹果,梨(违约food_id 1,50排序)

但我需要改变它。

如何改变

乔 - 香蕉,苹果,橘子(排序相同,以userfood字段值3,1,2)。

约翰 - 橙,苹果(排序相同,以userfood字段值2,1)

大卫 - 梨,橘子,苹果(排序相同,以userfood字段值30,2,1)

彼得 - 梨,苹果(与user相同。 food字段值50,1)

我已经尝试一个一个通过smarty模板插件选择sql。

但这太浪费资源了。我可以在php或mysql中做些什么?


+0

在查询结尾处添加'ORDER BY food_id DESC' – Mihai

+0

有许多方法可以实现你想要的东西,但是看起来,这是你要求的东西:http://stackoverflow.com/questions/4858828/sql-where-in-sort-by-order-of-the-list。 –

+2

1.标准化您的数据 – Strawberry

回答

1

您可以使用类似的代码

SELECT * FROM `food` WHERE `food_id` in (3,1,2) ORDER BY FIELD(food_id,3,1,2) 

实现 “乔 - 香蕉,苹果,橘子(排序相同,以user.food字段值3,1,2)” 同别人...你可以使用ORDER BY FIELD来订购你想要的东西

+0

这很方便。这是我想要的。我知道了。非常感谢BrijalSavaliya。 – Sky

+0

不用客气@Sky –

1

智能方式将是有一个与流体分离的user_food表,food_id对不是存储在单个字段的food_ids以逗号分隔的字符串。在这种情况下,查询将使用group_concat() function很简单:

select u.uid, u.user_name, group_concat(f.food_name order by f.food_id) as food_name 
from user u 
left join user_food uf on u.uid=uf.uid 
left join food f on uf.food_id=f.food_id 
group by u.uid, u.user_name 

快速的方法是使用find_in_set() function加入2个表,并再次使用GROUP_CONCAT():

select u.uid, u.user_name, group_concat(f.food_name order by f.food_id) as food_name 
from user u 
left join food f on find_in_set(f.food_id,u.food)>0 
group by u.uid, u.user_name 
+0

@ spencer7593欢迎你做出相同的评论(不参考订单) 。我检查过,这不是同一个OP。 – Shadow

+0

感谢阴影。我知道了。你让我学到了新的声明 – Sky