2009-12-01 3 views
1

У меня есть массив с таким набором пользователей и их соответствующей карме:Добавление массива в столбце MySQL в SELECT,

$some_array = Array 
(
    [user_id] => Array 
     (
      [0] => 4 
      [1] => 3 
      [2] => 5 
      [3] => 1 
     ) 

    [karma] => Array 
     (
      [0] => 129 
      [1] => 87 
      [2] => 13 
      [3] => 20 
     ) 

) 

Я задавался вопросом, если, когда вы извлечения пользовательских данных из таблицы MySQL, вы можете добавить дополнительную колонку с массивом кармы и заказать по этому дополнительному значению:

$query = 'SELECT user.*, {{$some_array['karma'] as extra_column}} WHERE 
user.id IN '.(implode(',',$some_array['user_id'])).' ORDER BY extra_column'; 

Любые идеи? Является ли это возможным?

+0

ли вы хотите, что дополнительный столбец только в вашем результате SELECT,? Значения в массиве не находятся в базе данных? –

+0

Я бы согласился с Эриком. Возможно, есть еще одно решение, в котором вы можете использовать таблицу для хранения некоторых данных или сделать какой-то расчет после возвращения результатов sql. Вы пытаетесь связать массив с результатом или отдельными элементами массива с номерами строк? –

+0

Фактически, только индивидуальный массив к номерам строк ... и @True Soft, эти вычисления кармы изменяются в зависимости от пользователя, который их просматривает и когда он их просматривает, вот почему я не понимаю, почему я должен его хранить , – Samin

ответ

2
SELECT id, ELT(FIELD(id, 4, 3, 5, 1), 129, 87, 13, 20) AS karma 
FROM (
     SELECT 4 AS id 
     UNION ALL 
     SELECT 3 AS id 
     UNION ALL 
     SELECT 5 AS id 
     UNION ALL 
     SELECT 1 AS id 
     ) q 
WHERE id IN (4, 3, 5, 1) 
ORDER BY 
     karma 
+0

Я не знал, что эти функции существуют. Это намного более чистое решение, чем заявление о моем случае. – Dathan

+0

это сработало! но как-то после того, как я удалил (SELECT ... UNION ALL) материал ... прежде чем он показывал всех пользователей в user_table. – Samin

+0

ой, и я хотел поблагодарить всех за интерес ... этот сайт действительно качается! – Samin

1

Не совсем (по крайней мере, не переживая какое-то действительно неприятное динамическое поколение sql).

Вам придется иметь карму в столбце таблицы пользователя (или какую-либо другую таблицу, которую вы могли бы присоединиться к таблице пользователя). Похоже, это должно храниться в базе данных в любом случае, правда?

0

Если значения в массиве должны быть обеспечены с помощью сценария (то есть, не существует в базе данных в любом случае вы могли бы присоединиться к ним, что идеальный случай), то я вижу две возможности :

  1. Создать временную таблицу для вашей кармы, вставить все значения кармы, а затем присоединиться запрос с вашей кармой массива
  2. Используйте случай заявление в вашем запросе. Это несостоятельное решение, если число пользователей велико.

код для генерации дела заявление может выглядеть примерно так:

$query = 'SELECT *, ' . GenerateCaseStatement($some_array) . ' AS extra_column FROM user WHERE user.id in (' . implode(',', $some_array['user_id']) . ' ORDER BY extra_column'; 

function GenerateCaseStatement($some_array) 
{ 
    $str = 'CASE id '; 
    for (i=0; i<array_len($some_array['user_id']); ++i) 
    { 
     $str .= ' WHEN ' . (int)($some_array['user_id'][i]) . ' THEN ' . (int)($some_array['karma'][i]); 
    } 
    $str .= ' ELSE NULL END'; 
    return $str; 
} 
Смежные вопросы