【问题标题】:Using ORDER BY on a multiple LEFT JOIN query对多个 LEFT JOIN 查询使用 ORDER BY
【发布时间】:2012-05-14 14:36:37
【问题描述】:

我有一个很长的查询,我终于开始工作了,但我无法ORDER BY date_time_added,这是除user_accountsrelationships 表之外的所有表中的一个字段。我如何使它正常工作?

$sql = "select distinct pb.user_id, pb.Full_name,
tv.why_onsite3, tv.onsite3_id, tv.other_date as onsite3_date, 
tv.user_allowed as tv_user_allowed, np.onsite4_name ,  
np.onsite4_id, np.other_date as onsite4_date, np.user_allowed 
as np_user_allowed, pml.med_name , pml.med_id, pml.other_date 
as pml_date, pml.user_allowed as pml_user_allowed, pl.onsite5_name,
pl.onsite5_test_id, pl.other_date as some_stats_date, pl.user_allowed as   
pl_user_allowed, chlp.problem_name_is , chlp.current_problem_id, 
chlp.other_date as chlp_date, chlp.user_allowed as chlp_user_allowed,
pphl.onsite10_health_prob_id , pphl.onsite10_problem_name_is, 
pphl.other_date as pphl_date, pphl.user_allowed as pphl_user_allowed,
al.onsite_id , al.onsite_name, al.other_date as onsite_date, 
al.user_allowed as al_user_allowed, sl.onsite2_id , sl.onsite2_name, 
sl.other_date as onsite2_date, sl.user_allowed as sl_user_allowed,
hal.onsite6_id , hal.reason_for_admit, hal.other_date as hal_date, 
hal.user_allowed as hal_user_allowed, il.onsite9_id , il.onsite9_name, 
il.other_date as il_date , il.user_allowed as il_user_allowed
from user_accounts pb left join some_stuff tv on pb.user_id = tv.user_id
left join some_onsite4s np on pb.user_id = np.user_id
left join some_med pml on pb.user_id = pml.user_id
left join list_hal hal on pb.user_id = hal.user_id
left join list_for_things il on pb.user_id = il.user_id
left join list_on  sl on pb.user_id = sl.user_id
left join some_all al on pb.user_id = al.user_id
left join some_list  pphl on pb.user_id = pphl.user_id
left join some_stats pl on pb.user_id = pl.user_id
left join some_probs chlp on pb.user_id = chlp.user_id

where (pb.user_id in (select fb.friend_id from relationships fb 
where fb.user_id = '$uid')
or pb.user_id in (select fb1.user_id from relationships fb1 
where fb1.friend_id = '$uid')
)

group by pb.user_id ORDER BY date_time_added DESC LIMIT $startrow, 20";

【问题讨论】:

  • 请提供示例数据和所需的输出。
  • 如果它在多个表中,您必须按 .date_time_added 排序
  • 但我想对其进行统一排序...我希望查询在所有表中使用该列并按 date_time_added DESC 排序。
  • @ariel user_id 是所有那些 (11) 个连接表中的主键吗?

标签: mysql group-by sql-order-by left-join


【解决方案1】:

在 ORDER BY 子句中,您必须指定您要排序的确切列。这意味着您必须为用于排序的列添加前缀,因为您有多个在多个表中称为相同的列。

另一种选择是完全重构查询并将 UNION 运算符与多个 SELECT 语句一起使用。每个 SELECT 语句都会从一个表中提取一组数据,并从该表中按列对该组进行排序。

解决方案取决于您要输出的数据 - 数据的上下文。

【讨论】:

  • 嘿,知道我该怎么做#1吗?我有点新,所以不确定你到底是什么意思。
  • 你的意思是像 tv.date_time_added、np.date_time_added 等等...?
  • 这取决于你想从这个查询中返回什么。如果您想以上面提供的这种格式返回数据,那么您必须编写如下内容: ORDEY BY np.date_time_added, tv.date_time_added.... 这意味着您首先按 np.date_time_added 排序所有内容,然后通过 tv.date_time_added 等...请记住,当您在 SQL 中排序时,如果您订购 ASCending,则 NULL 值排在第一位,如果您订购 DESCending,则排在最后。
  • 好的,在这种情况下它对我不起作用。我想统一排序。我不确定如何重写脚本..
  • 统一排序是没有逻辑的,想一想。你有两行两列,每一行都是日期。当您有 2 列可供选择排序时,不要考虑“统一”对这些行进行排序意味着什么。我认为您需要 UNION 运算符。请检查我上面的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2011-04-19
  • 2013-03-01
  • 1970-01-01
相关资源
最近更新 更多