sql >> Databasteknik >  >> RDS >> Mysql

Skicka en lista till MySQL lagrad procedur och kontrollera att ALLA värden finns

Det här är vad jag har fått hittills...

Inte idealiskt, men du kan räkna ut längden på föremålen i strängen med detta...

(SELECT LENGTH(permissions) - LENGTH( REPLACE(permissions, ',', '') ) + 1)

Den räknar i princip alla kommatecken i strängen och använder det som det totala antalet perms som skickats in.

CREATE PROCEDURE has_permission( IN account_id BIGINT, IN permissions TEXT)
BEGIN
  SELECT DISTINCT account_id
  FROM   pp_acl_user_roles ur, pp_acl_role_permissions rp
  JOIN pp_acl_permissions p ON rp.permission_id=p.id
  WHERE (
    ur.account_id = account_id
    #check for permission ids OR keys depending on what has been passed in.
    AND ( FIND_IN_SET(p.id, permissions) OR FIND_IN_SET(p.key, permissions) )
    AND ur.role_id = rp.role_id

  )
  #ensure we have ALL the permissions we asked for, not just some -makes IN() an AND not an OR.
  GROUP BY ur.account_id
  HAVING COUNT(DISTINCT rp.permission_id) = (SELECT LENGTH(permissions) - LENGTH( REPLACE(permissions, ',', '') ) + 1);



  1. MySQL POW() Funktion – Höj ett värde till kraften av ett annat värde

  2. PDO::PARAM för typ decimal?

  3. Neo4j installation

  4. Hur man har dynamisk SQL i MySQL lagrad procedur