我有两张桌子
[data] - title,maker,partnum,price
[cross] - 产品(data.partnum),title,maker,partnum,price
我想要的是通过sysn编号列出所有产品。如何通过订购 - >
获得联合所有数据我正在尝试这个
SELECT `title`,'Microsoft' AS `maker`,`partnum`,`price`
FROM data as d
WHERE sysn=%s
GROUP BY partnum
UNION ALL
SELECT `title`,`maker`,`partnum`,`price`
FROM cross as c
WHERE c.product=d.partnum
GROUP BY `partnum`
由于
答案 0 :(得分:0)
如果您正在使用MySQL,那么#34;交叉"是一个保留字,你必须将十字形用反引号括起来,将它用作表格名称(后面的反键是左上角键盘上的' 1')。
答案 1 :(得分:0)
你所要求的并不完全清楚。考虑在http://sqlfiddle.com中设置示例架构和数据。
“虚拟间隔”实现起来会非常混乱。这不是完全不可能的,只是凌乱。
对于以特定顺序返回的行,您将需要添加ORDER BY
子句。
为什么要包含GROUP BY
条款并不清楚。第一个GROUP BY
上的SELECT
将有效地“折叠”示例输出行1.和5.给予9989
相同的值partnum
。如果没有解释为什么你需要GROUP BY
,我会猜测你真正想要的是ORDER BY
条款。
还不清楚为什么字面值'Microsoft'
需要显示在SELECT
列表中,而不是maker
表中的data
列。这样做没有什么无效的SQL。但是如果没有解释,那就没有多大意义了。
我们应该问的问题......为什么需要这个特定的结果?是否有更容易实现的不同结果,这同样满足要求?
抛开“虚拟间隔”行,从这样的查询返回似乎满足大多数规范:
SELECT t.src
, t.title
, t.maker
, t.partnum
, t.price
FROM (
SELECT '[data]' AS `src`
, d1.title AS `title`
, d1.maker AS `maker`
, d1.partnum AS `partnum`
, d1.price AS `price`
, d1.partnum AS `product`
FROM data d1
WHERE d1.sysn = ?
UNION ALL
SELECT '[cross]'
, c2.title
, c2.maker
, c2.partnum
, c2.price
, c2.product
FROM cross c2
JOIN data d2
ON d2.partnum = c2.product
WHERE d2.sysn = ?
)
ORDER BY t.product DESC, t.src DESC, t.price ASC