SQL:加入 LIKE 和 min()
SQL: Join with LIKE and min()
我正在使用下面的查询来获取与 LIKE 匹配的价格最低的行。
Suppliers
id | name
----------------------------------------
1 | sup1
2 | sup2
Prices
id | article_number | price | supplier_id
------------------------------------------------
1 | 12345678 | 312 | 1
2 | 12345678 | 219 | 2
3 | 87654321 | 312 | 1
select prices.* from prices
inner join
(
select min(price) as price,
article_number as article_number from prices group by article_number
)
min_prices on prices.price = min_prices.price
and prices.article_number = min_prices.article_number
WHERE prices.article_number LIKE '".$q."%'
虽然现在也想从供应商那里获取suppliers.name-table:
select prices.*, suppliers.name from prices, suppliers
inner join
(
select min(price) as price,
prices.article_number as article_number from prices group by prices.article_number
)
min_prices on price = min_prices.price
and article_number = min_prices.article_number
WHERE
prices.article_number LIKE '".$q."%' AND
prices.supplier_id = suppliers.id"
这 returns 行数的 18 倍……?
而且table由10+百万行组成,所以效率很重要。
为了性能,在article_number
上添加索引,在子查询中使用prices.article_number LIKE '".$q."%'
。您最好使用 JOIN
而不是 ,
(这是旧方法)来组合两个表。像这样:
select prices.*, suppliers.name
from prices
inner join (
select min(price) as price, prices.article_number as article_number
from prices
where prices.article_number like '".$q."%'
group by prices.article_number
) min_prices
on price = min_prices.price
and article_number = min_prices.article_number
inner join suppliers
on prices.supplier_id = suppliers.id
where prices.article_number like '".$q."%'
我正在使用下面的查询来获取与 LIKE 匹配的价格最低的行。
Suppliers
id | name
----------------------------------------
1 | sup1
2 | sup2
Prices
id | article_number | price | supplier_id
------------------------------------------------
1 | 12345678 | 312 | 1
2 | 12345678 | 219 | 2
3 | 87654321 | 312 | 1
select prices.* from prices
inner join
(
select min(price) as price,
article_number as article_number from prices group by article_number
)
min_prices on prices.price = min_prices.price
and prices.article_number = min_prices.article_number
WHERE prices.article_number LIKE '".$q."%'
虽然现在也想从供应商那里获取suppliers.name-table:
select prices.*, suppliers.name from prices, suppliers
inner join
(
select min(price) as price,
prices.article_number as article_number from prices group by prices.article_number
)
min_prices on price = min_prices.price
and article_number = min_prices.article_number
WHERE
prices.article_number LIKE '".$q."%' AND
prices.supplier_id = suppliers.id"
这 returns 行数的 18 倍……?
而且table由10+百万行组成,所以效率很重要。
为了性能,在article_number
上添加索引,在子查询中使用prices.article_number LIKE '".$q."%'
。您最好使用 JOIN
而不是 ,
(这是旧方法)来组合两个表。像这样:
select prices.*, suppliers.name
from prices
inner join (
select min(price) as price, prices.article_number as article_number
from prices
where prices.article_number like '".$q."%'
group by prices.article_number
) min_prices
on price = min_prices.price
and article_number = min_prices.article_number
inner join suppliers
on prices.supplier_id = suppliers.id
where prices.article_number like '".$q."%'