0

以下は私の表です。ユーザーは特定の言語で複数のプロファイルを持つことができ、英語以外のプロファイルは優先度が高くなります。

+------------+--------+----------------+------------ --+
|ProfileID |UserID |ProfileLanguage |ProfilePriority |
+------------+--------+----------------+------------ --+
|1 |1 |en-US |2 |
+------------+--------+----------------+------------ --+
|2 |1 |es-MX |1 |
+------------+--------+----------------+------------ --+
|3 |1 |ja-JP |1 |
+------------+--------+----------------+------------ --+
|4 |2 |es-MX |1 |
+------------+--------+----------------+------------ --+
|5 |2 |ja-JP |2 |
+------------+--------+----------------+------------ --+
|6 |2 |de-DE |1 |
+------------+--------+----------------+------------ --+
|7 |3 |en-US |2 |
+------------+--------+----------------+------------ --+


例: スペイン語を話す訪問者が私のサイト (ProfileLanguage = 'es-MX' または ProfilePriority = 2) をリクエストした場合、次のようなレコードが必要です。

+------------+--------+----------------+------------ --+
|ProfileID |UserID |ProfileLanguage |ProfilePriority |
+------------+--------+----------------+------------ --+
|2 |1 |es-MX |1 |
+------------+--------+----------------+------------ --+
|5 |2 |ja-JP |2 |
+------------+--------+----------------+------------ --+
|7 |3 |en-US |2 |
+------------+--------+----------------+------------ --+


以下は、ユーザーを取得するための基本的な SQL です。

SELECT UserID, MIN(ProfilePriority) AS ProfilePriority
FROM Profile
WHERE ProfileLanguage = 'es-MX' OR ProfilePriority = 2
GROUP BY UserID

しかし、ご存知のように、私は UserID しか取得できませんが、ProfileID などの他の列情報も必要です。したがって、ここの専門家が適切なレコードを取得するための正しい SQL 式を教えてくれることを願っています。

4

4 に答える 4

3

profilepriority と userid が複合一意キーである場合、これは機能する可能性があります。

select p.* from Profile p join 
(SELECT UserID, MIN(ProfilePriority) AS ProfilePriority
FROM Profile
WHERE ProfileLanguage = 'en-US' OR ProfilePriority = 2
GROUP BY UserID) tt
on p.userID = tt.UserID and p.ProfilePriority = tt.ProfilePriority
于 2008-12-18T08:08:15.020 に答える
1
SELECT *
FROM Profile as tb1 inner join
(SELECT UserID, MIN(ProfilePriority) AS ProfilePriority
FROM Profile
WHERE ProfileLanguage = 'es-MX' OR ProfilePriority = 2
GROUP BY UserID) as tb2 on 
tb1.userid = tb2.userid and tb1.ProfilePriority = tb2.ProfilePriority

上記のクエリでは、必要なすべての列を * の代わりにカンマで区切って入力してください。

于 2008-12-18T08:07:15.040 に答える
0

profilepriorityとprofilelanguageの両方が正しければ、あなたが優先権を持っていると思います。したがって、これはその場合に役立つ可能性があります。

select p.* from
(select tt1.userid, min(tt.pr) pr from 
(
SELECT profileid, UserID, MIN(ProfilePriority) AS ProfilePriority, 1 as pr
FROM Profile
WHERE ProfileLanguage = 'en-US' and ProfilePriority = 2
GROUP BY profileid, UserID

union 

SELECT profileid, UserID, MIN(ProfilePriority) AS ProfilePriority, 2 as pr
FROM Profile
WHERE ProfileLanguage = 'en-US' or ProfilePriority = 2
GROUP BY profileid, UserID

) tt1
group by userid) tt2    
join
(
SELECT profileid, UserID, MIN(ProfilePriority) AS ProfilePriority, 1 as pr
FROM Profile
WHERE ProfileLanguage = 'en-US' and ProfilePriority = 2
GROUP BY profileid, UserID

union 

SELECT profileid, UserID, MIN(ProfilePriority) AS ProfilePriority, 2 as pr
FROM Profile
WHERE ProfileLanguage = 'en-US' or ProfilePriority = 2
GROUP BY profileid, UserID
) tt3
on tt2.userId = tt3.userId and tt2.pr = tt3.pr
join profile p on p.profileid = tt3.profileid
于 2008-12-18T09:49:25.067 に答える
0

あなたのテーブルとおそらくいくつかのサンプルデータがなければ明確ではありませんが、次のようにグループ化を拡張するだけで問題が解決されるように思えます:

SELECT UserID, ProfileID, MIN(ProfilePriority) AS ProfilePriority
FROM Profile
WHERE ProfileLanguage = 'en-US' OR ProfilePriority = 2
GROUP BY UserID, ProfileID
于 2008-12-18T08:08:21.870 に答える