簡體   English   中英

MySQL唯一值查詢

[英]Mysql unique values query

我有一個帶有名稱-值對和附加屬性的表。 同一名稱可以具有多個值。 如果發生這種情況,我想返回具有較高屬性值的行。

表:

ID | name | value | attribute
1  | set1 | 1     | 0
2  | set2 | 2     | 0
3  | set3 | 3     | 0
4  | set1 | 4     | 1

所需查詢結果:

name | value
set2 | 2
set3 | 3
set1 | 4

什么是表現最佳的sql查詢以獲得所需的結果?

效果最好的查詢如下:

select
 s.set_id,
 s.name as set_name,
 a.attrib_id,
 a.name as attrib_name,
 sav.value
from
 sets s
inner join set_attribute_values sav on 
  sav.set_id = s.set_id and sav.attrib_id = s.max_attrib_id
inner join attributes a on sav.attrib_id = a.attrib_id
order by
 s.set_id;

+--------+----------+-----------+-------------+-------+
| set_id | set_name | attrib_id | attrib_name | value |
+--------+----------+-----------+-------------+-------+
|      1 | set1     |         3 | attrib3     |    20 |
|      2 | set2     |         0 | attrib0     |    10 |
|      3 | set3     |         0 | attrib0     |    10 |
|      4 | set4     |         4 | attrib4     |    10 |
|      5 | set5     |         2 | attrib2     |    10 |
+--------+----------+-----------+-------------+-------+

顯然,要執行此操作,您還必須標准化您的設計並實現一個簡單的觸發器:

drop table if exists attributes;
create table attributes
(
attrib_id smallint unsigned not null primary key,
name varchar(255) unique not null
)
engine=innodb;

drop table if exists sets;
create table sets
(
set_id smallint unsigned not null auto_increment primary key,
name varchar(255) unique not null,
max_attrib_id smallint unsigned not null default 0,
key (max_attrib_id)
)
engine=innodb;

drop table if exists set_attribute_values;
create table set_attribute_values
(
set_id smallint unsigned not null,
attrib_id smallint unsigned not null,
value int unsigned not null default 0,
primary key (set_id, attrib_id)
)
engine=innodb;

delimiter #

create trigger set_attribute_values_before_ins_trig 
before insert on set_attribute_values
for each row
begin
  update sets set max_attrib_id = new.attrib_id 
    where set_id = new.set_id and max_attrib_id < new.attrib_id;
end#

delimiter ;

insert into attributes values (0,'attrib0'),(1,'attrib1'),(2,'attrib2'),(3,'attrib3'),(4,'attrib4');
insert into sets (name) values ('set1'),('set2'),('set3'),('set4'),('set5');

insert into set_attribute_values values
(1,0,10),(1,3,20),(1,1,30),
(2,0,10),
(3,0,10),
(4,4,10),(4,2,20),
(5,2,10);
select name,max(value)
from table
group by name

沒有簡單的方法可以做到這一點。

這里也提出類似的問題。

編輯:這是一個建議:

SELECT `name`,`value` FROM `mytable` ORDER BY `name`,`attribute` DESC

這並不是您所要求的,但是至少它會首先為您提供更高的屬性值,而您可以忽略其余的屬性。

再次編輯:另一個建議:

如果您知道該value正整數,則可以執行此操作。 令人討厭,但可以使用。

SELECT `name`,CAST (GROUP_CONCAT(`value` ORDER by `attribute` DESC) as UNSIGNED) FROM `mytable` GROUP BY `name`

要包含負整數,可以將UNSIGNED更改為SIGNED

SELECT name, value 
FROM (SELECT name, value, attribute 
      FROM table_name 
      ORDER BY attribute DESC) AS t 
GROUP BY name;

可能希望對所有這些選項進行基准測試,這是另一個。

SELECT t1.name, t1.value
  FROM temp t1
 WHERE t1.attribute IN (
   SELECT MAX(t2.attribute)
     FROM temp t2
    WHERE t2.name = t1.name);

怎么樣:

SELECT ID, name, value, attribute  
  FROM table A
 WHERE A.attribute = (SELECT MAX(B.attribute) FROM table B WHERE B.NAME = A.NAME);

編輯:好像有人已經說過一樣。

該解決方案可能會執行最佳:

Select ...
From Table As T
    Left Join Table As T2
        On T2.name = T.name
            And T2.attribute > T1.attribute
Where T2.ID Is Null

另一個可能效果不佳的解決方案(您需要對數據進行評估):

Select ...
From Table As T
Where Not Exists    (
                    Select 1
                    From Table As T2
                    Where T2.name = T.name
                        And T2.attribute > T.attribute
                    )

沒有對它們進行基准測試,但這是可行的:TableName = temm

1)具有屬性最大值的行:

select t.name, t.value
from (
   select name, max(attribute) as maxattr
   from temm group by name
) as x inner join temm as t on t.name = x.name and t.attribute = x.maxattr;

2)具有最大屬性值的前N行:

select name, value
from temm
where (
   select count(*) from temm as n
   where n.name = temm.name and n.attribute > temm.attribute
) < 1 ; /*  1 can be changed to 2,3,4 ..N  to get N rows */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM