Здесь у меня две таблицы, мне нужно присоединиться к этим двум таблицам, и мне нужно получить детали плана, я попробовал, но этого не происходит, вот мой код
user_info
id fullName
1 Arun
2 Sarvan
user_active_plan
id userId planName
1 1 Free Plan
2 1 Cool Plan
3 2 Free Plan
contact_property
id userId contactProperty
1 1 A
2 1 B
3 2 C
Здесь user_info (tablename) id (имя столбца) Я использую внешний ключ user_active_plan (имя таблицы) userId (имя столбца)
Я хочу получить последний план на основе userId, поэтому я использую desc order, но это не ожидаемые результаты:
$sql = "SELECT a.fullName,b.*FROM user_info a LEFT JOIN user_active_plan b ON a.id = b.userId GROUP BY b.userId ORDER BY id DESC";
$result = $this->GetJoinRecord($sql);
print_r($result);
Я получаю следующие неправильные результаты:
Array
(
[0] => Array
(
[fullName] => Sarvan
[id] => 3
[userId] => 2
[planName] => Free Plan
)
[1] => Array
(
[fullName] => Arun
[id] => 1
[userId] => 1
[planName] => Free Plan
)
)
)
Я ожидал следующее:
Array
(
[0] => Array
(
[fullName] => Sarvan
[id] => 3
[userId] => 2
[planName] => Free Plan
)
[1] => Array
(
[fullName] => Arun
[id] => 2
[userId] => 1
[planName] => Coll Plan
)
)
)
Обновленный ожидаемый ответ
Array
(
[0] => Array
(
[userId] => 1
[fullName] => Arun
[planId] => 2
[planName] => Cool Plan
[contactCount] => 2
)
[1] => Array
(
[userId] => 2
[fullName] => Sarvan
[planId] => 3
[planName] => Free Pla1
[contactCount] => 1
)
)
Вы можете получить последний план с простым подзапросом, без необходимости группировки. Количество контактов может быть выполнено с помощью простой группировки:
SELECT u.id AS userId, u.fullName, p.id AS planId, p.planName, COUNT(c.userId) AS contactCount
FROM user_info u
LEFT JOIN user_active_plan p ON u.id = p.userId
LEFT JOIN contact_property c ON u.id = c.userId
WHERE p.id = (SELECT id
FROM user_active_plan
WHERE userId = u.id
ORDER BY id DESC
LIMIT 1)
GROUP BY c.userId;
Вы также можете переместить условие из WHERE
в соединение:
SELECT u.id AS userId, u.fullName, p.id AS planId, p.planName, COUNT(c.userId) AS contactCount
FROM user_info u
LEFT JOIN user_active_plan p ON u.id = p.userId
AND p.id = (SELECT id
FROM user_active_plan
WHERE userId = u.id
ORDER BY id DESC
LIMIT 1)
LEFT JOIN contact_property c ON u.id = c.userId
GROUP BY c.userId;
group by
является неполной; общая группа по правилу: каждый выбранный атрибут должен быть либо в статистической функции, либо в группе по. Хотя старые версии MySQL позволяют это, он возвращает недетерминированные результаты. В более новых версиях mysql это не разрешено (если только в режиме совместимости).