我有一项任务,需要处理产品数据库,并且需要在运营商为 Sprint 的每个商店位置找到价格最高的手机。我想找到电话号码和ID。
I.E 我想找到每个 Sprint 手机 store.carrier = "Sprint"的phone.name 和phone.id,其中 item.price 是其商店中最大的。
我尝试了各种按 Max(price) 排序的 SQL 命令,然后尝试按品牌获取不同的值。
关系:
商店(ID、名称、运营商)
电话(ID、姓名、位置、价格)
哪里
store.id是store的主键。
product.id是产品的主键。
product.location 是引用 store.id 的外键。
我已经尝试过
SELECT distinct phone.name, phone.id
FROM phone
JOIN store ON phone.location = store.id
WHERE store.carrier = 'sprint'
ORDER BY price DESC LIMIT 1;
也尝试过
SELECT distinct phone.name, phone.id
FROM phone
JOIN store ON phone.location = store.id
WHERE store.carrier = 'sprint'
AND phone.price >= (SELECT MAX
FROM (SELECT MAX(price)
FROM phone
INNER JOIN store ON phone.location = store.id
GROUP BY location))
GROUP BY phone.id;
我期望的输出如下:
+-----+--------------------------+
| ID | NAME |
+-----+--------------------------+
| 12 | iPhone XS MAX |
| 97 | Samsung Galaxy S10 Plus |
| 143 | iPhone XS MAX |
| 163 | Google Pixel 3XL |
| 194 | iPhone XS MAX |
+-----+--------------------------+
相反,我会得到所有 Sprint 手机的列表,或者只是整体上最有值(value)的手机。
最佳答案
要获取前 1 行,您可以在子查询中使用递归迭代。然后在主查询中使用所有行排名值等于1来过滤掉:
SELECT q.id phone_id, q.name phone_name, q.store_id
FROM
(
SELECT p.id, p.name, p.location as store_id, p.price,
@rn := IF(@store = p.location, @rn + 1, 1) AS phone_rank,
@store := p.location as sto
FROM phone p
JOIN (SELECT @store := 1, @rn := 0) as q_iter
WHERE EXISTS ( SELECT 1 FROM store s WHERE s.id = p.location and s.carrier ='sprint' )
ORDER BY p.location, p.price DESC
) q
WHERE phone_rank = 1
ORDER BY q.store_id;
关于MYSQL 我可以找到特定类别中值(value)最高的产品吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57193434/