2010-03-02 3 views
2

EDIT :: Возможно, мне следует спросить, какой правильный способ получить набор результатов из базы данных. Когда у вас есть 5 объединений, где есть отношения 1: M, вы переходите к базе данных 5 раз для данных?Массив помощи. Ищите лучший способ

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

Этот массив дает мне несколько строк, из которых только некоторые нужны один раз, а другие нужны много раз. Мне нужно отфильтровать их, как я сделал ниже, но хочу, чтобы это было лучше, если это было возможно.

Array 
(
    [0] => Array 
     (
      [cid] => one line 
      [model] => one line 
      [mfgr] => one line 
      [color] => one line 
      [orderid] => one line 
      [product] => many lines 
      [location] => many lines 
     ) 
    [1] => Array 
     (
      .. repeats for as many rows as were found 
     ) 
) 

Этот код работает отлично, но опять же, я думаю, что есть более эффективный способ сделать это. Есть ли функция PHP, которая позволит мне немного почистить ее?

// these are the two columns that produce more than 1 result. 
    $product = ''; 
    $orderid = ''; 

    foreach($res as $key) 
    { 
     // these produce many results but I only need one. 
     $cid = $key['cid']; 
     $model = $key['model']; 
     $mfgr = $key['mfgr']; 
     $color = $key['color']; 
     $orderid = $key['orderid']; 

     // these are the two columns that produce more than 1 result. 
     if($key['flag'] == 'product') 
     { 
      $product .= $key['content']; 
     } 
     if($key['flag'] == 'orderid') 
     { 
      $orderid .= $key['content']; 
     } 
    } 

// my variables from above in string format: 

Вот запрашиваемая SQL

SELECT 
cid, 
model, 
mfgr, 
color, 
orderid, 
product, 
flag 
FROM products Inner Join bluas ON products.cid = bluas.cid 
WHERE bluas.cid = 332 
ORDER BY bluas.location ASC 
+0

использовать базу данных? – knittl

+0

Да, результаты взяты из базы данных. – jim

+0

фильтр уже в базе данных с оператором 'where' ... – knittl

ответ

1

Не видя вашу структуру базы данных, это немного трудно расшифровать, как вы на самом деле хотите, чтобы манипулировать данными.

Возможно, это то, что вы ищете?

SELECT p.cid, p.model, p.mfgr, p.color, p.orderid, p.product, p.flag, GROUP_CONCAT(p.content SEPARATOR ', ') 
FROM products AS p 
INNER JOIN bluas AS b ON p.cid = b.cid 
WHERE b.cid = 332 
GROUP BY p.cid, p.flag 
ORDER BY b.location ASC 

Так что теперь для каждого продукта cid каждый flag будет иметь запись, состоящую из разделенных запятыми список вместо того, чтобы там быть много повторяющихся для каждого flag записи.

Тогда после того, как вы закончите со строкой вы можете быстро превратить его в массив для дальнейшей обработки, делая что-то вроде:

explode(', ', $key['content']); 

Опять же это на самом деле трудно сказать, что информация, которую вы пытаетесь вытащить не видя вашей структуры базы данных. Ваш SQL-запрос также не соответствует вашему коду, например, я даже не вижу, как вы захватываете content.

Во всяком случае, я уверен, что некоторые комбинации GROUP BY и GROUP_CONCAT(more info) является то, что вы ищете.

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