Nasıl çıktı birden fazla ilişkisel MySQL tablodan çok boyutlu bir dizi yapmak?

2 Cevap php

Olay, Etkinlikler ve Kullanıcıları: ben üç tablo var. Olay tablo, belirli bir olay (isim, tarih, vb) ilgili bilgileri, kullanıcılar tablo depolar kullanıcı bilgilerini (isim, yaş, vb) depolar ve Etkinlikler tablo yalnızca Event_ID ve USER_ID depolama ikisi arasındaki ilişkisel olduğunu.

Ben belirli bir kullanıcı (USER_ID = 20 diyelim) için tüm olayları listelemek ve her biri aşağıda bu olay da tüm diğer kullanıcıları göstermek gerekir.

Örneğin, kullanıcı "Steve'in Birthday", "Homecoming Parti" ve "Sanat göster Downtown" gidiyor Diyelim ki. Ben ekrana gerekir:

Steve's Birthday - Also going: Sarah, Mike, Tom Homecoming Party - Also going: Mike, Andy, Roger, Steve Art Show Downtown - Also going: Sarah

Ben USER_ID maç Olaylar tablosunda tüm Event_ID bulunuyor bulmak için ilk veritabanı sorgulama denedim. Sonra ben bu diziyi alır, ve her biri için EVENT_NAME ve EVENT_DATE bulabilirsiniz. Ama sonra her bir kişi de bu olay oluyor bulmak için nasıl anlamaya çalışıyorum yol kendimi çok fazla kafa karıştırıcı ediyorum.

Herkes onu koparmak için bir yöntem yapmak ve önermek için çalışıyorum ne anlayabilir?

2 Cevap

Sen madde ve böyle bir şey bir de subselect kullanabilirsiniz:

SELECT `event`.*, `user`.* from `user`,`user_event`, `event` 
WHERE `event`.`id` in (
   SELECT `user_event`.`event_id` from `user_event`, `user` 
   WHERE `user`.`id` = ?
)
AND `user`.`id` = `user_event`.`user_id`
AND `user_event`.`event_id` = `event`.`id`
ORDER BY `event`.`id`

Temelde okur: Aşağıdaki olaylardan giden tüm kullanıcıları bulmak - olayların listesi joe gidiyor olaylar event_ids alarak bulunabilir.

Ben birçok tabloya benim çok yeterli bilgi (event_id) olsun çünkü subselect ben olay tabloda çekmeyin.

Satırlarda yedekli veri olacaksa olacak. Sen satırlar üzerinde yineleme işlemini çıkan dizi göndermek istediğiniz gidiyoruz.

$groupedArray = array();
foreach ($result as $item)
{
   if(!isset($groupedArray[$item['event_id']])
   {
       // Create an empty array if we don't have one for this grouping yet.
       $groupedArray[$item['event_id']] = array();
   }

   // Append the current item to the subarray.    
   $groupedArray[$item['event_id']][] = $item;

}

Döngünün Bu tür aslında oldukça deyimseldir. Genel bir "yeniden gruplandırma" fonksiyonu bulmak / yazmak isteyebilirsiniz.

Gibi bir şey

SELECT 
  e.Name,
  Concat_WS(', ', u.Name) AS AlsoGoing
  /* maybe some more stuff */
FROM
  Events eu
LEFT JOIN Events a
  ON (eu.Event_ID = a.Event_ID)
LEFT JOIN Users u
  ON u.User_ID = a.User_ID
LEFT JOIN Event e
  ON (eu.Event_ID = e.Event_ID)
WHERE
  eu.User_ID = 20 /* or some other ID */
  AND a.User_ID <> eu.User_ID
GROUP BY
  eu.Event_ID;     

Join ilk "aynı olay oluyor else" ilişkisi oluşturur. Nerede maddesinin (liste Steven için yapılmış ise, o "başka kim gidiyor" görünmez) özdeş kullanıcıları filtreler ve sadece Steven katılan olayları seçer. İkinci ve üçüncü basitçe kimlik adlı kullanıcı ve olay bilgisi eklemek katılın. Olay tarafından gruplama bir (ayrılmış) kullanarak siz ("insanlar da özetledi coming" ile) olay başına bir satır olsun emin olur.