我们有这样的声明:
(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 | IDBev_property 的
type_id | val_id | bev_id | IDPROPERTY_VALUE 的
名字| ID
我正在寻找的是按玻璃价格(type_id ='23')和瓶子价格(type_id ='22')订购的结果,但是由于第一个选择返回的事实,似乎联合包含重复项{ {1}},第二个返回3456 | 7.5
,因为价格/玻璃是7.5,价格/瓶是55; 如何从返回和排序表的第二个SQL语句中消除这些重复项?
此外,通过左连接创建一个伪表来创建一个3456 | 55
的表,但是因为这应该能够扩展到多个价格类型,所以我认为UNION会更有效率。只需向正确的方向推进就会有所帮助。
答案 0 :(得分:1)
您可以在1个查询中执行此操作,方法是指定bev_property.type_id以匹配具有内部值的IN()子句。
要仅返回找到的第一个,您应该需要一个DISTINCT SELECT的伴随字段bev_id
。
要对它们进行排序,只需添加适当的降序ORDER BY子句即可。这应首先排序,并过滤掉第二个bev_property.type_id
值。 (数据库永远不会按特定顺序返回任何内容,除非你告诉他们,有些人可能有内部约定,或者看起来可能会这样做但除非你在{{1}中指定ORDER BY
子句,否则永远不能保证这是可重复的。声明。)
SELECT
一个UNION不会真的更快,因为你必须完成整个查找两次,如果你没有索引这个字段,那么你将做一个完整的表遍历,匹配1个元素两次,而不是1个表遍历,与2个元素匹配。 (在整张桌子上行走通常很慢,不能将简单元素相互匹配)
如果正确编制索引,我认为执行新的选择查询和查询分析器再次运行可能会有一点点开销,但我不确定。它可能足够聪明,可以识别查询之间的相似性,因此无关紧要。
尽管尝试特定的数据库并不总是有害。每当您尝试query optimisation使用不同的语句时,请使用EXPLAIN,这将显示查询将执行的操作,并且它将覆盖整个表,对文件中的数据进行排序等等。< / p>
答案 1 :(得分: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