Jag har ett fält Permission som är binärt. Eftersom jag inte vet hur din data ser ut men det resultat du presenterar ger vid handen att du kanske skulle testa med SELECT DISTICT ?? Nej Distinct ger alla unika värden, dvs id 2 ger tillbaka både värde 1 och 15 Varför vill du bara ha reda på användarens högsta behörighet per område, och inte behörighetsnivån för varje usergroup? Det känns som en konstig funktion i ett program... Nej, nej, nej jag förklarade att jag inte vill ha max behörighet! Utan jag vill ha användarens alla behörigheter dvs Jag orkar inte tänka ut en lösning just nu tyvärr :) Nej db bryter inte mot 1NF... Det "går" att lösa i t.ex. en UDF, men frågan är om det är värt det. Som tidigare talare/skrivare: Jag orkar inte lösa det just nu - men det går. Jenny, Förutom den i MySQL inbyggda gruppfunktionen BIT_OR() som gör det du önskar (vilket jag nämnde på PHPportalen), verkar följande fungera i åtminstone MySQL: Perfekt Per! Det fungerade utmärkt!!! Tack så mycket!Binärt fält med "bitwise or"
Där jag har värdena:
1 - Användaren får läsa
2 - Skapa
4 - Modifiera
8 - Radera
Innehåller fältet värdet 15 så har användaren rätt att utföra allt.
Användaren kan vara med i flera usergroups som har olika permissions.
Exempelvis har användaren 6 i en grupp men kanske bara 2 i en annan grupp.
Jag har en select fråga där jag listar användarens alla permissions
på olika områden i programmet ID 1, 2, 3 osv...innebär olika områden.
Problemet är om användaren i exempelvis område 2 har olika permissions i olika
usergroups. Då vill jag ha en enda rad med "bitwise or" med värde 6 och inte två olika där
den ena har 2 och den andra 6. Någon som vet någon bra funktion för
dynamiskt antal rader. Jag gjorde ett litet test på
<code>select checksum_agg(binary_checksum(Permission)) from Permission</code>
men det gav inte det resultat jag ville ha.Någon som har en lösning?
Så här ser min select sats ut nu:
<code>
SELECT PG.PermissionEntity_ID as PermissionEntity_ID, PG.Permission
FROM (PermissionEntity PE LEFT JOIN Permission PG ON PG.PermissionEntity_ID = PE.PermissionEntityID)
JOIN lnkUserUserGroup UUG ON UUG.UserGroup_ID = PG.UserGroup_ID
WHERE PE.permissiontype_id IN (select permissiontypeid from permissiontype where permissionownertype = 2)
AND UUG.[User_ID] = 1 order by PermissionEntity_ID</code>
Resultat:
ID Värde
1 1
2 1
2 15
3 1
Jag skulle vilja ha resultatet:
ID Värde
1 1
2 15
3 1
där jag vill få ut bitwise or (operand = |)
på id = 2
dvs select 1 | 15 = 15
select 2 | 6 = 6
select 1 | 6 = 7
osvSv: Binärt fält med "bitwise or"
//Mikael SandSv:Binärt fält med "bitwise or"
och det jag vill ha är endast värde 15....Sv:Binärt fält med "bitwise or"
Sv: Binärt fält med "bitwise or"
<code>select 1 | 6 </code>
ger ett resultat på 7
och är det samma som bitwise or fast jag kan inte använda operatorn | i detta sammanhang eftersom antalet rader per användare är dynamiskt och med min nuvarande sqlfråga får jag två rader istället för 1.
DVS om användaren har värdet 1 i en grupp men värdet 6 i en annan så vill jag ha en enda rad med värdet 7
och inte två stycken rader där den ena är 1 och den andra 6...
Hade jag vetat antal rader etc så hade jag kunnat skriva <code>select fält | fält</code> men eftersom det är dynamiskt antal rader så behöver jag en slags funktion, antingen en egen påhittad eller en befintlig funktion
Så nej max() fungerar inte i detta läget.Sv:Binärt fält med "bitwise or"
Databasen bryter mot 1NF. Gör om, gör rätt.. ;)
http://en.wikipedia.org/wiki/First_normal_form#First_normal_formSv: Binärt fält med "bitwise or"
Jag har
en tabell User
en tabell UserGroup
en länktabell mellan User och Usergroup
möjligtvis att tabellen Permission bryter mot 1NF men den måste se ut så här för att underlätta kopplingen mot olika aktörer både jag och den som har bestämt databasen anser att detta är den smidigaste lösningen istället för 1NF:
en tabell Permission som kan ha en relation till usergroup, eller employee, eller business eller application
Problemet är att en user kan vara medlem i flera usergroups och det är en usergroup som är kopplad till permission.
Vi kan inte ha db på ett annat sätt än det här så därför undrar jag om någon har en lösning. Annars får jag hämta alla rader och manipulera dem i koden istället som en utväg, men det vore snyggast att lösa det i databasen.Sv:Binärt fält med "bitwise or"
Troligen är det mer tidseffektivt att lösa det i din klient.
Allt är ju till sist en fråga om pengar... Hur mycket tid du måste lägga ner eller hur mycket pengar en konsult vill ha.
Eftersom du skrev att det vore "snyggt" att ha det i databasen, så gissar jag att det inte är prio ett att få till detta :)
/mickeSv:Binärt fält med "bitwise or"
Fältet Permission bryter mot 1NF.
1NF säger att attribut skall vara atomära. Ett bytevärde som måste bitmaskas för att få ut olika typer av informationer är inte ett atomärt värde. Man får garanterat problem om man bryter mot 1NF.
Du bör ha flera bit-kolumner för Read, Write, Admin osv.
Men för att hjälpa dig på traven: Googla efter Bitwise OR SQL server. (jag har aldrig sysslat med det av ovan nämnda skäl..)
Du kanske kan göra SUM(bitmaskvärde) GROUP BY UserId.. och sedan göra bitwise OR på det, men jag får huvudvärk bara jag tänker på det... ;)Sv: Binärt fält med "bitwise or"
SELECT (MAX(Permission & 8) | MAX(Permission & 4) | MAX(Permission & 2) | MAX(Permission & 1)) ...
Om det fungerar i andra databasmotorer vet jag tyvärr inte. Men det är nog värt ett försök.
Sv:Binärt fält med "bitwise or"
<code>SELECT (MAX(Permission & 8) | MAX(Permission & 4) | MAX(Permission & 2) | MAX(Permission & 1)) ...
</code>