2012-04-08 4 views
1

Я вставляю несколько идентификаторов из моего флажка в базу данных MySQL, используя форму сообщения php. В примере I вставьте id (таблица значений флажка test) в mysql. Теперь мне нужна функция для извлечения данных из MySQL и печати на мою страницу с моим примером выводом (печать по горизонтали имени списка таблицы test где данные = идентификатор пользователь)php извлекает несколько данных из mysql

Мое значение Флажка (имя таблицы test):

id | name 
----+------- 
    1 | test1 
    2 | test2 
    3 | test3 
    4 | test4 
    5 | test5 
    6 | test6 
    7 | test7 
    9 | test9 

MySQL вставки данных (имя таблицы usertest):

id | data | userid 
----+---------+-------- 
    1 | 1:4:6:9 | 2 
    2 | 1:2:3:4 | 5 
    3 | 1:2  | 7 

Пример Outout :(печать горизонтальный список имен тестовой таблицы, где данные = идентификатор пользователя)

user id 2 choise : test1 - test4 - test6 - test9 

Благодаря

+3

Необходимо нормализовать дизайн своей базы данных. Сохранение нескольких значений в одном поле составляет 99,999% от времени, когда BAD-дизайн. И это не один из 0,001% раз. –

+0

У меня не было выбора! – Gcoder

+1

Почему у вас не было выбора? Я предлагаю вам начать с чтения ** [эта статья о первой нормальной форме] (http://en.wikipedia.org/wiki/First_normal_form) ** – nnichols

ответ

2

Предполагая, что ваш стол usertest имеет только три столбца, перечисленные в вашем примере вы должны заменить его следующим -

CREATE TABLE usertest (
    data INTEGER NOT NULL, 
    userid INTEGER NOT NULL, 
    PRIMARY KEY (data, userid) 
); 

Тогда ваши данные будут выглядеть -

+------+--------+ 
| data | userid | 
+------+--------+ 
| 1 | 2 | 
| 4 | 2 | 
| 6 | 2 | 
| 9 | 2 | 
| 1 | 5 | 
| 2 | 5 | 
| 3 | 5 | 
| 4 | 5 | 
| 1 | 7 | 
| 2 | 7 | 
+------+--------+ 

Запросить эти данные затем становится тривиальным -

SELECT usertest.userid, GROUP_CONCAT(test.name SEPARATOR ' - ') 
FROM usertest 
INNER JOIN test 
    ON usertest.data = test.id 
GROUP BY usertest.userid 

Вы можете прочитать больше о GROUP_CONCAT here

Вы можете использовать PHP решение и сохранить возможные значения флажка в массиве индексируется по идентификаторам. Что-то вроде -

<?php 

$db = new PDO('mysql:dbname=test;host=127.0.0.1', 'user', 'pass'); 
$sql = 'SELECT id, name FROM test'; 

$stmt = $db->prepare($sql); 
$stmt->execute(); 

$array = array(); 

while ($row = $stmt->fetchObject()) { 
    $array[$row->id] = $row->name; 
} 

$sql = 'SELECT userid, data FROM usertest'; 

$stmt = $db->prepare($sql); 
$stmt->execute(); 

while ($row = $stmt->fetchObject()) { 
    $data = explode(':', $row->data); 
    foreach($data as $key => $val) { 
     $data[$key] = $array[$val]; 
    } 
    print "user id {$row->userid} choise : " . implode(' - ', $data) . "<br/>\n"; 
} 
+0

Я полностью согласен, Соединительный стол идеально подходит. но я редактирую любой старый скрипт, и у меня нет шансов на изменение. поэтому я вынужден работать с тем же методом. можешь мне помочь ?! – Gcoder

+0

Невозможно присоединиться к отдельным значениям в многозначном поле AFAIK. Вы можете сделать это, используя хранимую процедуру и зациклив на значения в поле mv. Вы также можете сделать это на PHP и использовать низкую производительность как часть обоснования для нормализации ваших структур данных. – nnichols

Смежные вопросы