1

我们有这样的声明:

(SELECT res_bev.bev_id, property_value.name AS priority 
    FROM res_bev, bev_property, property_value 
    WHERE res_bev.res_id='$resIn'
        AND bev_property.bev_id=res_bev.bev_id
        AND bev_property.type_id='23'
        AND property_value.id=bev_property.val_id)
UNION
(SELECT res_bev.bev_id, property_value.name as priority 
    FROM res_bev, bev_property, property_value 
    WHERE res_bev.res_id='$resIn' 
        AND bev_property.bev_id=res_bev.bev_id 
        AND bev_property.type_id='22' 
        AND property_value.id=bev_property.val_id)

我们有三个表:

res_bev
res_id | bev_id | ID

Bev_property
type_id | val_id | bev_id | ID

属性值
名称 | ID

我正在寻找的是按 glass price(type_id='23') 然后按 bottle price(type_id='22') 订购的结果,但似乎联盟包含重复项,因为第一个选择返回说3456 | 7.5,第二个返回3456 | 55因为 price/Glass 是 7.5,price/Bottle 是 55;如何从要返回的第二个 SQL 语句和有序表中消除这些重复项?

此外,通过左连接创建一个伪表来创建一个表被愚弄了bev_id | price/Glass | price/Bottle,但是由于这应该能够扩展到多种价格类型,我认为 UNION 会更有效。只需朝着正确的方向推动就会有所帮助。

4

2 回答 2

1

您可以通过指定 bev_property.type_id 在 1 个查询中执行此操作,以匹配具有内部值的 IN() 子句。

要只返回找到的第一个,您应该需要一个DISTINCT SELECT的伴随字段bev_id

要对它们进行排序,只需添加适当的降序 ORDER BY 子句。这应该首先排序并过滤掉第二个bev_property.type_id值。(数据库永远不会以特定顺序返回任何内容,除非您告诉他们这样做,有些可能有内部约定,或者看起来确实如此,但除非您ORDER BY在语句中指定子句,否则这永远不能保证是可重复的SELECT。)

SELECT DISTINCT res_bev.bev_id, property_value.name AS priority 
FROM res_bev, bev_property, property_value 
WHERE res_bev.res_id='$resIn'
    AND bev_property.bev_id=res_bev.bev_id
    AND bev_property.type_id IN ('23','22')
    AND property_value.id=bev_property.val_id
ORDER BY bev_property.type_id DESC;

UNION 并不会真正更快,因为您必须进行两次整个查找,并且如果您没有索引该字段,那么您将执行整个表遍历,匹配 1 个元素两次而不是 1 个表遍历与 2 个元素匹配。(走过整张桌子通常很慢,不匹配简单的元素)

正确索引后,我认为您可能会在执行新的选择查询和再次运行查询分析器时产生很小的开销,但我不确定。它可能足够聪明,可以识别查询之间的相似性,所以这无关紧要。

不过,尝试特定的数据库并不总是有害的。每当您尝试使用不同的语句进行查询优化时,将它们与EXPLAIN一起使用,这将向您显示查询将执行的操作以及它是否会遍历整个表、对文件中的数据进行排序等...

于 2012-06-18T21:58:34.380 回答
1

除非我遗漏了什么,或者你的问题

SELECT res_bev.bev_id, 
       property_value.name AS priority 
FROM res_bev, bev_property, property_value 
WHERE res_bev.res_id='$resIn' 
AND bev_property.bev_id=res_bev.bev_id 
AND (bev_property.type_id='23' OR bev_property.type_id='22')
AND property_value.id=bev_property.val_id)
order by bev_property.type_id desc

PS如果你想订购一个工会

尝试一些类似的东西

Select * from
(
select ...
Union
select ...
) somenameforqryinparentheses
Order by Somecolumn1, somecolumn2
于 2012-06-18T22:02:18.977 回答