избавление от повторных идентификаторов клиентов в запросе MySQL - PullRequest
0 голосов
/ 23 апреля 2010

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

вот та загадка, которую я придумал, чтобы получить все записи одновременно

SELECT morning, afternoon, date, date2, fname, lname,  customers.customerid
FROM customers
LEFT OUTER JOIN attend ON ( customers.customerid = attend.customerid ) 
RIGHT OUTER JOIN noattend ON ( noattend.date2 = attend.date ) 
WHERE noattend.date2
BETWEEN '$date2'
AND '$date3'
AND DayOfWeek( date2 ) %7 >1
AND group ={$_GET['group']}
ORDER BY lname ASC , fname ASC , date2 DESC 

таблицы являются customer-> customerid, fname, lname

attend-> CustomerID, утро, день, дата

noattend-> date2 (таблица всех дней для заполнения пробелов)

Теперь у меня проблема в том, как начать новую строку в таблице при изменении идентификатора клиента. Мой запрос выше тянет в

клиент 1 утро 2

клиент 1 утро 1

Клиент 2 утра 2

Клиент 2 утра 1

тогда как я пытаюсь получить

customer1 morning2 morning1

customer2 morning2 morning1

Я не знаю, возможно ли это в SQL или, скорее всего, в PHP

Ответы [ 4 ]

1 голос
/ 04 мая 2010

Я наконец понял, чего мне не хватало.

Чтобы обратиться к элементу массива, который мне нужно было использовать, мне нужно было использовать двойную скобку, т.е. $ customer_array [0] [lname], $ customer_array [1] [lname]. Я понимаю, что это, вероятно, очевидно для большинства, но это полностью ускользало от меня. Ключ к моему пониманию это было
print_r (customer_array), который я много видел, но никогда не работал должным образом.

Тогда это был всего лишь случай извлечения всех строк базы данных с помощью:

$customer_array =array();
while($row1=mysql_fetch_assoc($extract1)){
$customer_array[] = $row1; 
}

, а затем выполнить цикл, поскольку у меня есть фиксированное количество записей:

 for ($x=0;$x<=900;)
{ 
echo $customer_array[$x][fname];
echo$customer_array[$x][lname];
for($y=0;$y<=30;$y++)
{
echo $customer_array[$x][morning];
echo $customer_array[$x][afternoon];
        $x++;
    }
     }

Надеюсь, это поможет кому-то еще.

0 голосов
/ 23 апреля 2010

Можете ли вы достичь этого с помощью SQL? Возможно, но я сомневаюсь, что это выглядело бы хорошо.

Вот простое решение PHP.

$mornings_by_customer = array();
foreach ($result as $r) {
    $mornings_by_customer[$r['customerid']][] = $r['morning'];
}

Пример структуры ваших результатов и пример того, что вы бы предпочли - в нотации массива PHP - позволил бы дать вам более точный ответ. Это, однако, должно дать вам общее представление.

0 голосов
/ 03 мая 2010

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

$sql = "SELECT morning, afternoon, date, date2, fname, lname,  customers.customerid
FROM customers
LEFT OUTER JOIN attend ON ( customers.customerid = attend.customerid ) 
RIGHT OUTER JOIN noattend ON ( noattend.date2 = attend.date ) 
WHERE noattend.date2
BETWEEN '$date2'
AND '$date3'
AND DayOfWeek( date2 ) %7 >1
AND group ={$_GET['group']}
ORDER BY lname ASC , fname ASC , date2 DESC ";

$results = mysql_fetch_result($sql);
$customer_array = array()

// Load up an array with each customer id as the key and array full of mornings as the value
while($row = mysql_fetch_array($results)) {
 array_push($customer_array[$row['customerid']], $row['morning']);
}
// For each customer ID, get the array of mornings
foreach ($customer_array as $customerID=>$morningArray) {
 echo $customerID;
 // For each morning array item, echo it out
 forreach ($morningArray as $key=>$value) {
   echo " $value";
 }
}
0 голосов
/ 23 апреля 2010

Если я объединяю связанные таблицы в одну строку (что, безусловно, является лучшим способом, а не вложенными запросами, и следует делать это большую часть времени, когда это возможно), я склонен выполнять форматирование в аккуратные таблицы с помощьюcode.

(псевдокод предоставлен, поскольку я не помню PHP):

// query database
while !EOF {
  currentCustomerId = $database["CustomerId"]
  // do opening table row stuff; customer name, etc.
  while !EOF && currentCustomerId == $database["CustomerId"] {
     // do the relational columns from the join
     // move to next record
  }
  // do closing table row stuff
}

Внешний цикл выполняет итерации по каждому клиенту, а внутренний цикл выполняет итерацию по реляционным данным для этого клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...