it-swarm.com.de

Abrufen von Daten aus mehreren Datenbanktabellen basierend auf den Ergebnissen der ersten

Ich versuche, Benutzer-IDs von Benutzern abzurufen, die Teil einer Gruppe sind. Ich muss dann diese Benutzer-IDs nehmen und die E-Mail-Adressen für diese Benutzer-IDs abrufen. Die Ergebnisse müssen durch Kommas getrennt werden. Als ich das zum ersten Mal versuchte, dachte ich, ich brauche nur die Benutzer-IDs, also schrieb ich das Folgende. Dies funktioniert hervorragend und gibt mir alle IDs in einer durch Kommas getrennten Liste. Ich bin ratlos darüber, wie ich jetzt die Ergebnisse der folgenden Abfrage verwende, um die E-Mail-Adressen aus der Datenbank zu erhalten. Lc_users WHERE 'id' = die Ergebnisse der folgenden Abfrage

$db = JFactory::getDbo();
$db->setQuery("SELECT `memberid` FROM `lc_community_groups_members` WHERE `groupid` = 1 AND `approved` = 1 ");
$column = $db->loadColumn();
return(implode(',',$column));

Jede Hilfe wäre sehr dankbar

2
Todd

Ja, JOIN sollte den Trick machen. Hier ist meine Frage:

$query->select($db->quoteName('b.email'))
        ->from($db->quoteName('#__community_groups_members', 'a'))
        ->leftJoin(
            $db->quoteName('#__users', 'b')
            . ' ON (' . $db->quoteName('b.id')
            . ' = '
            . $db->quoteName('a.memberid') . ')'
        )
        ->where($db->quoteName('a.groupid') . ' = 1 ')
        ->where($db->quoteName('a.approved') . ' = 1');
1
Dmitry Rekun

Erstens würde ich vorschlagen, dass Sie die neuesten Codierungsstandards für Ihre Datenbankabfrage verwenden, wie auf der Dokumentationsseite gezeigt.

Sie können alles mit einem join zu einer Abfrage zusammenfassen und sollten außerdem #__ Als Datenbankpräfix verwenden, das automatisch durch lc_ Ersetzt wird.

Ich gebe zu, dass ich mit Joins nicht sehr sicher bin, probiere aber Folgendes aus:

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select($db->quoteName(array('a.*', 'b.memberid')))
      ->from($db->quoteName('#__community_groups_members', 'a'))
      ->where($db->quoteName('groupid') . ' = 1')
      ->where($db->quoteName('approved') . ' = 1')
      ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('b.email') . ' = ' . $db->quoteName('b.id') . ')')
      ->where($db->quoteName('b.id') . ' = ' . $db->quote('b.memberid'));

$db->setQuery($query);
$column = $db->loadColumn();
0
Lodder

Ihre Aufgabe erfordert eine einzelne Zeichenfolge mit durch Kommas getrennten E-Mail-Adressen - SQL kann all das für Sie erledigen und ein paar nützliche Details hinzufügen.

$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->select("GROUP_CONCAT(DISTINCT B.email ORDER BY B.email)")
                ->from("lc_community_groups_members A")
                ->innerJoin("lc_users B ON A.memberid = B.id")
                ->where("A.groupid = 1 AND A.approved = 1");
    //echo $query->dump();
    $db->setQuery($query);
    if (!$emails = $db->loadResult()) {
        echo "No Qualifying Email Addresses";
    } else {
        echo $emails;
    }
} catch (Exception $e) {
    echo "Syntax Error"; // . $e->getMessage();
}

Mit Beispieldaten wie folgt:

|  lc_community_groups_members        |  JOIN ON memberid=id  |         lc_users        |
|-------------------------------------|                       |-------------------------|
|  memberid  |  groupid  |  approved  |                       |  id  |       email      |
|------------|-----------|------------|                       |-------------------------|
|      1     |     2     |      1     |           <           |   1  |   [email protected]    |
|      2     |     1     |      1     |           <           |   2  | [email protected] |
|      3     |     1     |      0     |           <           |   3  |   [email protected]    |
|      4     |     1     |      1     |           <           |   4  | [email protected] |
|      5     |     1     |      1     |           <           |   5  |   [email protected]    |
|      6     |     2     |      0     |           <           |   6  |   [email protected]    |
|      7     |     1     |      0     |           <           |   7  |   [email protected]    |
|      8     |     1     |      1     |           <           |   8  |   [email protected]    |
|      9     |     1     |      1     |           <           |   9  |   [email protected]    |
---------------------------------------                       ---------------------------

Sie würden die E-Mails von ids erwarten: 2,4,5,8,9

  • INNER JOIN wird verwendet, da keine Nullzeilen erwünscht sind.
  • GROUP_CONCAT () ist ein perfektes Werkzeug, um die E-Mail-Werte mit Kommas zusammenzufügen. Es bietet auch den zusätzlichen Vorteil, dass Duplikate (für einen optimierten Postausgang) entfernt und alphabetisiert werden (falls Sie die Ausgabe manuell scannen).
  • loadResult () ist die Methode, die aufgerufen wird, wenn Ihre Ergebnismenge ein einzelner Wert ist.

Die Ausgabe von meinem Codeblock ist:

[email protected],[email protected],[email protected],[email protected]
0
mickmackusa