2015-11-10 2 views
0

У меня немного вопроса ...MSQL + PHP - Проверьте вопросы Query

Так что я пытаюсь сделать это:

У меня есть пользовательская таблица:

------------------------- 
| Table: userlist  | 
------------------------- 
| Id | GuestOf | User | 
|-----------------------| 
| 0 | System | Bill | 
|-----------------------| 
| 1 | Bill | Jason | 
|-----------------------| 
| 2 | Jason | Jack | 
|-----------------------| 
| 3 | Jason | Jill | 
|-----------------------| 
| 4 | Jack | Matt | 
|-----------------------| 
| 5 | Jill | Stu | 
|-----------------------| 
| 6 | Jack | Gwen | 
|-----------------------| 
| 7 | Jill | Frank | 
|-----------------------| 

В основном, гости Джейсона - Джек и Джилл, гости Джека - Мэтт и Гвен, а гости Джилл - Стю и Фрэнк.

Теперь я хочу узнать, есть ли у гостей Джейсона оба их гостей.

Но я могу проверять это каждый раз, когда к списку добавляется новый гость. В этом случае, когда Фрэнк добавляется в список Джилл.

Это код, который я сейчас использую:

function countGuests($User) { 
    $sql = "SELECT COUNT(`Id`) CntId FROM `userlist` WHERE `GuestOf` LIKE '$User'"; 

    $res = mysql_query($sql); 

    $temp = mysql_fetch_array($res, MYSQL_BOTH); 

    return $temp["CntId"];   
} 

function checkCompletion($UserId) { 
    $population = array(); 

    $sql = "SELECT `User` FROM `userlist` WHERE `GuestOf` LIKE '$UserId'"; 

    $res = mysql_query($sql); 

    if (mysql_num_rows($res) > 0) { 
    while ($temp = mysql_fetch_array($res, MYSQL_BOTH)) { 
     $population[] = $temp["User"];  
    } 

    $partialPop = 0; 

    for ($i = 0; $i < count($populaton); ++$i) { 
     $partialPop = $partialPop + countGuests($population[$i]); 
    } 
    } 

    return $partialPop; 
} 

Который должен дать мне результат: 7 (Джейсон, Джек, Джилл, Мэтт, Гвен, Стю, Франк)

Однако, Я получаю результат: 0. Что случилось с моим запросом?

Я был бы признателен за любую помощь/корректировки ...

Спасибо!

+0

Рассматривали ли вы перестройку своей базы данных? странный метод для отношений – Daimos

+1

Вы должны создать таблицу с отношением гостей. В этом базовом примере нет большой разницы, но когда вы начинаете добавлять информацию в свои таблицы (пол, адрес, даты и т. Д.), Эта проблема важна. –

+0

AFAIK, эта таблица является иерархической. Проверьте это id = 0 (system): это корень всей структуры. Вам не хватает важной информации. Запрашиваемая информация - это получение списков всех гостей в системе ??? если это вопрос, вы должны начать думать о рекурсивной функции. –

ответ

0

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

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

Вы должны вызвать эту функцию с пустым массивом, и я надеюсь, что результат возвращается в тот же массив, но я не уверен, что это так в php ....

function retrieveAllUsers($UserId, $population) { 

    $sql = "SELECT `User` FROM `guestlist` WHERE `Guest` LIKE '$UserId'"; 

    $res = mysql_query($sql); 

    if (mysql_num_rows($res) > 0) { 
    temp = mysql_fetch_array($res, MYSQL_BOTH); 
    // traverse the array $temp 
    // in every iteration.... 
     // push into $population the value $temp["User"];  
     retrieveAllUsers($currentUser, $population); 

    } 
    } 

} 
+0

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

+0

@JonDavis Jill, безусловно, гость Фрэнка! – Strawberry

1

Рассмотрите следующее. Я изменил имена столбцов/таблиц, чтобы облегчить концептуализацию ...

DROP TABLE IF EXISTS guestlist; 

CREATE TABLE guestlist 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,user VARCHAR(12) NOT NULL 
,guest VARCHAR(12) NOT NULL 
,UNIQUE(user,guest) 
); 

INSERT INTO guestlist VALUES 
(1,'System','Bill'), 
(2,'Bill','Jason'), 
(3,'Jason','Jack'), 
(4,'Jason','Jill'), 
(5,'Jack','Matt'), 
(6,'Jill','Stu'), 
(7,'Jack','Gwen'), 
(8,'Jill','Frank'); 

SELECT a.user 
    , a.guest 
    , GROUP_CONCAT(b.guest) guest_of_guest 
    , COUNT(*) total 
    FROM guestlist a 
    LEFT 
    JOIN guestlist b 
    ON b.user = a.guest 
WHERE a.user = 'Jason' 
GROUP 
    BY user 
    , guest; 
+-------+-------+----------------+-------+ 
| user | guest | guest_of_guest | total | 
+-------+-------+----------------+-------+ 
| Jason | Jack | Gwen,Matt  |  2 | 
| Jason | Jill | Frank,Stu  |  2 | 
+-------+-------+----------------+-------+ 
2 rows in set (0.00 sec) 
+0

Спасибо! Пожалуйста, см. Мой ответ на ваш комментарий выше ... –