为了达到数据库的使用目的,我们首先建立数据表,它们在 PANDAS 的形式下,它们的形式如文章最后的图所示。
在这里,我们关注如何从 MySQL 数据库中检索这些数据,实用的检索语句细节如下 检索全部原料和检索价格最低的原料
检索全部原料比较简单,只需要遍历整个表即可。比较复杂的是如何检索出全部原料,同时去除重复值。因为如前所述,同一种原料可以有不止一条记录,这些记录的价格不同。因此,我们要做两件事情,首先是按价格进行排序,取出价格最小的资源,而当价格重复时,我们选“最新”添加的条目,因此,查询语句为
// Select entries with lowest prices
SELECT DISTINCT * FROM RESOURCE
WHERE PRICE IN (SELECT MAX(price) FROM RESOURCE GROUP BY UID)
// Only select one entry with lowest prices
SELECT t0.*
FROM RESOURCE t0
WHERE id in (SELECT MAX(id) AS id FROM (
SELECT * FROM (
SELECT t1.*
FROM RESOURCE t1
JOIN (
SELECT MIN(price) AS price
FROM RESOURCE t1
GROUP BY UID
) t2
ON t2.price = t1.price
) t3
) t4
GROUP BY UID) 检索产品的原料
针对特定的产品,检索它的原料可以用最简单的方式,就是按照产品表列出的原料,在原料表中进行查询,两个表做交运算就可以得到产品需要的原料;但由于原料表可能有重复物料,这样做可能会导致物料重复,因此需要进行过滤;另外,还需要考虑哪些物料不在原料表中,查询语句为
# Simple joint
SELECT *
FROM PRODUCT a
JOIN RESOURCE b
ON a.SRC = b.UID
WHERE a.uid = '{p}'
# Select lowest price with latest entry
SELECT *
FROM PRODUCT a
JOIN
(
SELECT t0.*
FROM RESOURCE t0
WHERE id in (SELECT MAX(id) AS id FROM (
SELECT * FROM (
SELECT t1.*
FROM RESOURCE t1
JOIN (
SELECT MIN(price) AS price
FROM RESOURCE t1
GROUP BY UID
) t2
ON t2.price = t1.price
) t3
) t4
GROUP BY UID)
)as b
ON a.SRC = b.UID
WHERE a.uid = '{p}'
# Not have resources
SELECT *
FROM PRODUCT a
WHERE a.uid = '{p}'
AND a.src NOT IN (SELECT UID FROM RESOURCE)
最后,我们还要求数据库进行一些简单的计算,计算的内容可以包括对应项相乘并相加。在本场景中,它可以用来计算商品的价格,查询语句如下
# The price
sql = f"""
SELECT SUM(a.COUNT * b.PRICE)
FROM PRODUCT a
JOIN (
SELECT t0.*
FROM RESOURCE t0
WHERE id in (SELECT MAX(id) AS id FROM (
SELECT * FROM (
SELECT t1.*
FROM RESOURCE t1
JOIN (
SELECT MIN(price) AS price
FROM RESOURCE t1
GROUP BY UID
) t2
ON t2.price = t1.price
) t3
) t4
GROUP BY UID)
) b
ON a.SRC = b.UID
WHERE a.uid = '{p}'
"""