【问题标题】:php + mysql two table sortingphp + mysql 两表排序
【发布时间】:2016-08-12 20:02:30
【问题描述】:
+------------------------------------+
 | 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。

没关系,可以展示一下。

但是这个数组($food_data) 是按food.food_id 排序的,我需要与user.food 排序相同

EG秀:

Joe - apple,orange,banana(默认按 food_id 1,2,3 排序)

John - apple,orange(默认按 food_id 1,2 排序)

David - apple,orange,pear(默认按 food_id 1,2,50 排序)

Peter - apple,pear(默认按 food_id 1,50 排序)

但我需要改变它。

如何改成

Joe - 香蕉、苹果、橙色(排序与 user.food 字段值 3,1,2 相同)

John - orange,apple(排序与 user.food 字段值 2,1 相同)

David - pear,orange,apple(排序与 user.food 字段值 30,2,1 相同)

Peter - pear,apple(排序与 user.food 字段值 50,1 相同)

我曾通过 smarty 模板插件一一尝试选择 sql。

但这太浪费资源了。我可以用 php 或 mysql 做点什么吗?


【问题讨论】:

  • 在查询末尾添加ORDER BY food_id DESC
  • 有很多方法可以实现你想要的,但看起来,这就是你想要的:stackoverflow.com/questions/4858828/…
  • 1.规范化您的数据
  • 所以你建议我将两条sql语句合并为一条语句?
  • 你想要这样 SELECT * FROM test WHERE id in (2,3,1) ORDER BY FIELD(id,3,2,1) ?

标签: php mysql sorting


【解决方案1】:

明智的方法是使用单独的 user_food 表,其中包含 uid、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 连接两个表,然后再次使用 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 

【讨论】:

  • @spencer7593 欢迎您发表相同的评论(不提及订购者)。我查了,不是同一个OP。
  • 谢谢影子。我得到了它。你让我学会了一个新的说法
【解决方案2】:

你可以使用类似的代码

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 来订购您想要的任何东西

【讨论】:

  • 太方便了。这就是我想要的。我得到了它。非常感谢 BrijalSavaliya。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多