Использование mysql LEFT Join DESC не работает

0

Здесь у меня две таблицы, мне нужно присоединиться к этим двум таблицам, и мне нужно получить детали плана, я попробовал, но этого не происходит, вот мой код

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
        )

      )
  • 0
    Ваша group by является неполной; общая группа по правилу: каждый выбранный атрибут должен быть либо в статистической функции, либо в группе по. Хотя старые версии MySQL позволяют это, он возвращает недетерминированные результаты. В более новых версиях mysql это не разрешено (если только в режиме совместимости).
  • 0
    У Аруна есть два плана, какой из них вы хотите увидеть? Вы сказали, что хотите план Coll, но на основании каких критериев? Когда вы сделали группировку, вы попросили запрос вернуть один из двух планов, но вы не сказали ему, какой именно, поэтому он выбрал один случайным образом. Вам необходимо указать критерии выбора плана для возврата.
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

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

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;
  • 0
    Спасибо братан, спасибо большое

Ещё вопросы

Сообщество Overcoder
Наверх
Меню