mysql使用另一个表中的关系逐列对表中的数据进行排序

mysql使用另一个表中的关系逐列对表中的数据进行排序,mysql,sql,Mysql,Sql,我的问题很类似。 但是加上一个我无法实现的条件。 我有两张桌子 商品:关于商品的信息。项目有“普通”或“数字”类型。列“sortnum”表示主要的排序结果 id | name | itemtype CREATE TABLE IF NOT EXISTS `wares` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sortnum` int(11) NOT NULL, `name` varchar(255) NOT NULL, `itemtype

我的问题很类似。 但是加上一个我无法实现的条件。
我有两张桌子
商品:关于商品的信息。项目有“普通”或“数字”类型。列
“sortnum”
表示主要的排序结果

id | name | itemtype

CREATE TABLE IF NOT EXISTS `wares` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sortnum` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `itemtype` enum('usual','digital') NOT NULL DEFAULT 'usual',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

INSERT INTO `wares` (`id`, `sortnum`, `name`, `itemtype`) VALUES
(1, 8, 'ware1', 'usual'),
(2, 7, 'ware2', 'usual'),
(3, 4, 'ware3', 'usual'),
(4, 11, 'ware4', 'usual'),
(5, 21, 'ware5', 'usual'),
(6, 22, 'ware6', 'digital'),
(7, 2, 'ware7', 'usual'),
(8, 33, 'ware8', 'digital'),
(9, 15, 'ware9', 'usual'),
(10, 19, 'ware10', 'digital');
关系:带有表中项目之间关系的表。一些
类型为“普通”的项目与
类型为“数字”的项目相关。并非所有项目都链接

id_usualware | id_digitalware

CREATE TABLE IF NOT EXISTS `relations` (
  `id_usualware` int(11) NOT NULL,
  `id_digitalware` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `relations` (`id_usualware`, `id_digitalware`) VALUES
(1, 6),
(4, 8),
(7, 10);

我需要使用表关系从表商品中选择数据
'wares.'sortnum'
。如果类型为
“普通”
的项目与项目
“数字”
相关,则此数字项目在结果中遵循此
“普通”

id | sortnum | name  | itemtype
 7 |    2    | ware7 | 'usual'
 10|    19   | ware10| 'digital'  
 3 |    4    | ware3 | 'usual'
 2 |    7    | ware2 | 'usual'
 1 |    8    | ware1 | 'usual'
 6 |    22   | ware6 | 'digital'
 4 |    11   | ware4 | 'usual'
 8 |    33   | ware8 | 'digital'
 9 |    15   | ware9 | 'usual'
 5 |    21   | ware5 | 'usual'
我的查询版本无法正常工作:

SELECT w2.*, r.* 
FROM wares w
  LEFT JOIN relations r ON r.id_digitalware = w.id
  LEFT JOIN wares w2 ON w2.id = COALESCE( r.id_digitalware, w.id ) 
WHERE w2.sortnum >0
ORDER BY 
  CASE WHEN (r.id_usualware IS NULL) THEN w2.sortnum END ASC , 
  CASE WHEN (r.id_usualware IS NOT NULL) THEN r.id_usualware END DESC 

请帮助我进行MySQL查询。

我认为您可以通过添加另一个左连接并将排序更改为使用sortnum来解决此问题,如下所示:

select w2.*
from wares w 
left join relations r on r.id_digitalware = w.id 
left join wares w2 on w2.id = coalesce(r.id_digitalware, w.id)
left join wares w3 on r.id_usualware = w3.id
order by coalesce(w3.sortnum, w.sortnum), (w.itemtype = 'usual') desc;

根据您在fiddle中提供的示例数据,这将输出:

| ID | SORTNUM |   NAME | ITEMTYPE |
|----|---------|--------|----------|
|  7 |       2 |  ware7 |    usual |
| 10 |       9 | ware10 |  digital |
|  3 |       4 |  ware3 |    usual |
|  2 |       7 |  ware2 |    usual |
|  1 |       8 |  ware1 |    usual |
|  6 |      10 |  ware6 |  digital |
|  4 |      11 |  ware4 |    usual |
|  8 |       6 |  ware8 |  digital |
|  9 |      15 |  ware9 |    usual |
|  5 |      21 |  ware5 |    usual |
实际上,再进一步看,我认为您可以将查询更改为:

select w.*
from wares w 
left join relations r on r.id_digitalware = w.id 
left join wares w2 on r.id_usualware = w2.id
order by coalesce(w2.sortnum, w.sortnum), (w.itemtype = 'usual') desc;

您能更具体地回答您的问题吗?您已经编写了“不好用”。它在什么方面不好用?在我的错误查询中,数据按“itemtype”排序。但我需要指出的是,主订单是“sortnum”。如果类型为“通常”的当前项目与项目“数字”相关,则此数字项目在结果中遵循此“通常”。谢谢!第二个版本很棒!