我有以下查询:
select transactions.timestamp, products.productHash
from transactions
inner join transactionItems on transactionItems.transactionHash = transactions.transactionHash
inner join products on products.productHash = transactionItems.productHash
where userKey = '8eb6a8a9-4f1a-4402-89ab-4d1fbffd1284'
and (products.type = 'applier' and products.gender = 'f')
and products.additionalData->'$."skintone"' in ('-1', -1)
and exists
(
select 1 from materialAppliers
where materialAppliers.productHash = products.productHash
and materialAppliers.applierType = 'skin'
)
group by transactionItems.productHash
给我以下结果:
+---------------------+----------------------------------------+
| timestamp | productHash |
+---------------------+----------------------------------------+
| 2014-12-30 23:37:32 | cHJvZF81YWZhZmJkY2JiMzQ0OC4yMTg5MTY3OQ |
| 2014-11-30 19:17:47 | cHJvZF81YWZiZDVlOTQ3ZjM5Mi44NTc2Mjc0MQ |
+---------------------+----------------------------------------+
我必须与materialAppliers
匹配的productHash
加入:
+----------------------------------------+------------------------------------------+-------+
| productHash | applierHash | asset |
+----------------------------------------+------------------------------------------+-------+
| cHJvZF81YWZhZmJkY2JiMzQ0OC4yMTg5MTY3OQ | bWF0QXBwXzVhZmFmYmRjY2E1ZTExLjE3NDA3NjYx | val1 |
| cHJvZF81YWZhZmJkY2JiMzQ0OC4yMTg5MTY3OQ | bWF0QXBwXzVhZmFmYmRjY2Q1MmE0LjI3NTA4Nzcx | val2 |
| cHJvZF81YWZiZDVlOTQ3ZjM5Mi44NTc2Mjc0MQ | bWF0QXBwXzVhZmJkNWU5NDdmNWQ0LjU1MzQ1NDg5 | val3 |
| cHJvZF81YWZiZDVlOTQ3ZjM5Mi44NTc2Mjc0MQ | bWF0QXBwXzVhZmJkNWU5NmY2MTA0LjQyOTkxNzY5 | val4 |
| cHJvZF81YWZiZDVlOTQ3ZjM5Mi44NTc2Mjc0MQ | bWF0QXBwXzVhZmJkNWU5OTZlNGU3LjcxNTI1MDY1 | val5 |
+----------------------------------------+------------------------------------------+-------+
这样每个materialApplier
都有自己的行,由timestamp
组成,取自上一个查询;来自applierHash
的{{1}}和asset
:
materialAppliers
我该如何做到这一点?
答案 0 :(得分:1)
只需将materialAppliers
加入您的查询。
SELECT *
FROM
(
select transactions.timestamp, products.productHash
from transactions
inner join transactionItems on transactionItems.transactionHash = tra nsactions.transactionHash
inner join products on products.productHash = transactionItems.productHash
where userKey = '8eb6a8a9-4f1a-4402-89ab-4d1fbffd1284'
and (products.type = 'applier' and products.gender = 'f')
and products.additionalData->'$."skintone"' in ('-1', -1)
and exists
(
select 1 from materialAppliers
where materialAppliers.productHash = products.productHash
and materialAppliers.applierType = 'skin'
)
group by transactionItems.productHash
) x
LEFT JOIN materialAppliers
ON materialAppliers.productHash = x.productHash;
但是列列中有一列,您没有GROUP BY
,并且您没有应用任何聚合函数。虽然MySQL接受较低版本或某些设置并不是一件好事。我建议修理这个。使用例如max()
获取最新的时间戳。
SELECT *
FROM
(
select max(transactions.timestamp), products.productHash
from transactions
inner join transactionItems on transactionItems.transactionHash = tra nsactions.transactionHash
inner join products on products.productHash = transactionItems.productHash
where userKey = '8eb6a8a9-4f1a-4402-89ab-4d1fbffd1284'
and (products.type = 'applier' and products.gender = 'f')
and products.additionalData->'$."skintone"' in ('-1', -1)
and exists
(
select 1 from materialAppliers
where materialAppliers.productHash = products.productHash
and materialAppliers.applierType = 'skin'
)
group by transactionItems.productHash
) x
LEFT JOIN materialAppliers
ON materialAppliers.productHash = x.productHash;
答案 1 :(得分:0)
看起来很简单:使用materialAppliers添加一个内部联接,然后在select ...和group中添加两个选中的值,我错过了什么?
select transactions.timestamp, products.productHash, ma.applierHash, ma.asset
from transactions
inner join transactionItems on transactionItems.transactionHash = transactions.transactionHash
inner join products on products.productHash = transactionItems.productHash
inner join materialAppliers ma on ma.productHash = products.productHash
where userKey = '8eb6a8a9-4f1a-4402-89ab-4d1fbffd1284'
and (products.type = 'applier' and products.gender = 'f')
and products.additionalData->'$."skintone"' in ('-1', -1)
and exists
(
select 1 from materialAppliers
where materialAppliers.productHash = products.productHash
and materialAppliers.applierType = 'skin'
)
group by transactionItems.productHash
您应该能够摆脱存在,只需添加and ma.applierType = 'skin'
即可。我说应该是因为我不完全理解applierType和producthash之间的关系,但它看起来应该有效。
如:
select transactions.timestamp, products.productHash, ma.applierHash, ma.asset
from transactions
inner join transactionItems on transactionItems.transactionHash = transactions.transactionHash
inner join products on products.productHash = transactionItems.productHash
inner join materialAppliers ma on ma.productHash = products.productHash
where userKey = '8eb6a8a9-4f1a-4402-89ab-4d1fbffd1284'
and products.type = 'applier'
and products.gender = 'f'
and products.additionalData->'$."skintone"' in ('-1', -1)
and ma.applierType = 'skin'
答案 2 :(得分:0)
我会尝试为整个第一个查询设置别名,然后在之后将最终连接添加到materialAppliers表中
Select * from (select transactions.timestamp, products.productHash
from transactions
inner join transactionItems on transactionItems.transactionHash = transactions.transactionHash
inner join products on products.productHash = transactionItems.productHash
where userKey = '8eb6a8a9-4f1a-4402-89ab-4d1fbffd1284'
and (products.type = 'applier' and products.gender = 'f')
and products.additionalData->'$."skintone"' in ('-1', -1)
and exists
(
select 1 from materialAppliers
where materialAppliers.productHash = products.productHash
and materialAppliers.applierType = 'skin'
)
group by transactionItems.productHash) as x
inner join materialAppliers as ma on x.producthash = ma.productHash