2017-05-23 4 views
2

Ich versuche die Tabelle mit einer Abfrage in Unter Array mit Spaltennamen verbinden => Spaltenwert ..Php mysql verbindet mit Feldnamen Subarray

Kurztisch (1) „Benutzer“ Struktur mit Daten:

user_id email  ... 
1   [email protected] ... 
2   [email protected] ... 

Kurztisch (2) "users_permissions" Struktur mit Daten:

user_id plugin_enter offers_view ... 
1   1    0    ... 
2   1    1    ... 

Wenn ich klassische Methode verwenden - join

links
SELECT `uperms`.*, `u`.* 
FROM (`users` as u) 
LEFT JOIN `users_permissions` as uperms ON `u`.`user_id` = `uperms`.`user_id` 

ich klassische Ausgabe

[0] = array(
    'user_id' => 1, 
    'email' => [email protected], 
    'plugin_enter' => 1, 
    'offers_view' => 0 
), 
[1] = array(
    'user_id' => 2, 
    'email' => [email protected], 
    'plugin_enter' => 1, 
    'offers_view' => 1, 
    ... 
), 

Alles was ich brauche ist Ausgabe in Sub-Array wie folgt aus:

[0] = array(
    'user_id' => 1, 
    'email' => [email protected], 
    'permissions => array(
     'plugin_enter' => 1, 
     'offers_view' => 0 
), 
), 
... 

Ist dies möglich, mit einer Abfrage zu tun?

Tabelle2 (Berechtigungen) enthält etwa 60 Spalten. Ist es möglich CONCAT Spaltennamen mit Spaltenwert, wenn nur eine Zeile mit Table1 verbunden ist?

+0

ich denke, das ist in PHP nur für eine einzige Abfrage nicht möglich – Chinito

+0

Ändern Sie Ihre Tabelle2 zu etwas wie UID, Name, Wert, um 60 Spalten zu vermeiden und Abfragen nicht zu warten. –

Antwort

1

MySQL hat keine Arrays oder verschachtelten Strukturen, daher ist es nicht möglich, dies in SQL zu tun.

Ändern Sie Ihre Abfrage so, dass Sie allen Feldern von users_permissions einen konsistenten Benennungsstil geben. Dann können Sie eine PHP-Schleife verwenden, um alle Array-Elemente zu sammeln, deren Schlüssel mit diesem Muster in das Array permissions übereinstimmen.

Abfrage:

SELECT u.*, up.plugin_enter AS perm_plugin_enter, up.offers_view AS perm_offers_view, ... 
FROM users AS u 
JOIN users_permissions AS up ON u.user_id = up.user_id 

PHP:

foreach ($all_results as &$row) { 
    $permissions = array(); 
    foreach ($row as $key => $value) { 
     if (strpos($key, 'perm_') === 0) { 
      $permission[substr($key, 5)] = $value; 
      unset($row[$key]); 
     } 
    } 
    $row['permissions'] = $permissions; 
} 

Sie es durch die Verkettung alle Spaltennamen und Werte in der Tabelle tun könnte:

SELECT u.*, CONCAT_WS(',', CONCAT('plugin_enter:', plugin_enter), CONCAT('offers_view:', offers_view), ...) AS permissions 
FROM users AS u 
JOIN users_permissions AS up ON u.user_id = up.user_id 

dann Ihre PHP-Code kann Verwenden Sie explode(), um $row['permissions'] in ein Array von name:value Paaren und t zu teilen hen konvertieren diese zu key=>value im PHP-Array.

Eine andere Lösung ist Ihr users_permissions Tabelle neu zu gestalten:

user_id permission_type value 
1  plugin_enter 1 
1  offers_view  0 
... 
2  plugin_enter 1 
2  offers_view  1 
... 

Dann können Sie abfragen:

SELECT u.*, GROUP_CONCAT(permission_type, ':', value) AS permission 
FROM users AS u 
JOIN users_permissions AS up on u.user_id = up.user_id 
+0

Danke für die Meinung, aber Berechtigungen Tabelle hat nicht alle Spalten mit der gleichen "Endung" – drozdo

+0

OK, ich zeige eine andere Möglichkeit, es zu tun, die nicht auf die Spalten nach einem bestimmten Namensschema abhängt. Es weist Aliase in der Abfrage zu. – Barmar

+0

fuuh 60 Spalten? es zu viel schreiben .. – drozdo

0

Eine weitere mögliche sollution ist Präfixe hinzufügen abzufragen.
per Post inspiriert: https://stackoverflow.com/a/9926134/2795923

SELECT `u`.*, ':prefix_start:', `uperms`.*, ':prefix_end:' 
FROM (`users` as u) 
LEFT JOIN `users_permissions` as uperms ON `u`.`user_id` = `uperms`.`user_id` 

Output-Array wie folgt aussieht:

[0] => array(
    'user_id' => 1 
    'email' => [email protected], 
    'prefix_start' => 
    'plugin_enter' => 1, 
    'offers_view' => 0 
    'prefix_end' => 
) 
... 

Dann einfach PHP-Skript alle Array-Daten zwischen prefix_start hinzuzufügen und in eigenen Sub-Array prefix_end.