0

我正在尝试对 MySQL 中的几个表进行扁平化,但不确定如何最好地优化它

http://sqlfiddle.com/#!2/310a8/15

我在结果集中得到一个额外的行,因为有第二个“装饰器”(INSERT 语句中的最后一行)

我试图在虚拟表 JOINS 中做一个 LIMIT 但这不起作用(因为它对自己进行操作,所以永远不会出现 ON 条件,导致零行)

我能做的两件事是

1)在查询结束时执行 GROUP BY a.id 2)创建另一个名为的列rankrank = 1在虚拟表中执行

执行#2(模式更改,大量移动)是否更有效,或者 GROUP BY 是否足够。似乎获得更多“具体”的最佳方法是咬紧牙关做#2,这样我什至可以衡量“优先级” - 即,如果有 2 个“装饰者”,谁是第一位的。

4

1 回答 1

0

我认为您需要扩展子查询以使用特定条件过滤掉重复的用户。例如,如果您想选择具有最大 user_id 的用户,则查询将是:

SELECT
 a.id, a.name, 
 b.id as mixer_user_id, 
 b.first_name as mixer_first, b.last_name as mixer_last,
 c.id as baker_user_id, 
 c.first_name as nbaker_first, c.last_name as baker_first,
 d.id as decorator_user_id, 
 d.first_name as decorator_first, d.last_name as decorator_last,
 a.active
FROM
 orders a 
 JOIN (
  SELECT b1.id as id, b1.first_name, b1.last_name, b2.order_id 
  FROM users b1, order_users b2
  WHERE b1.id=b2.user_id and b2.user_type='mixer'
   AND b1.id = (SELECT MAX(user_id) FROM order_users WHERE order_id = b2.order_id AND user_type = b2.user_type)
 ) b ON (a.id = b.order_id)
 JOIN (
  SELECT c1.id as id, c1.first_name, c1.last_name, c2.order_id 
  FROM users c1, order_users c2
  WHERE c1.id=c2.user_id and c2.user_type='baker'
   AND c1.id = (SELECT MAX(user_id) FROM order_users WHERE order_id = c2.order_id AND user_type = c2.user_type)
 ) c ON (a.id = c.order_id)
 JOIN (
  SELECT d1.id as id, d1.first_name, d1.last_name, d2.order_id 
  FROM users d1, order_users d2
  WHERE d1.id=d2.user_id and d2.user_type='decorator'
   AND d1.id = (SELECT MAX(user_id) FROM order_users WHERE order_id = d2.order_id AND user_type = d2.user_type)
 ) d ON (a.id = d.order_id)
WHERE
 a.id in (1001, 1002, 1003);

如果您有不同的 RDBMS(例如 Oracle 或 MSSQL),您将使用 CTE 创建一个分组的 order_users 表。但只要你坚持使用 MySQL,你就别无选择在子查询中使用它。

如果你经常使用这个查询,你应该考虑创建 VIEW

于 2013-11-08T03:19:34.730 回答