web-dev-qa-db-fra.com

Obtenir des données de plusieurs tables de base de données en fonction des résultats de la première

J'essaie d'extraire les identifiants des utilisateurs appartenant à un groupe. Je dois ensuite prendre ces identifiants et obtenir les adresses électroniques de ces identifiants. Les résultats doivent être séparés par des virgules. Lors de ma première tentative, j’ai pensé que j’avais besoin de l’identifiant de l’utilisateur, j’ai donc écrit ce qui suit. Cela fonctionne très bien et me donne tous les identifiants dans une liste séparée par des virgules. Je ne comprends pas comment utiliser maintenant les résultats de la requête ci-dessous pour obtenir les adresses électroniques de la base de données lc_users WHERE 'id' = les résultats de la requête ci-dessous

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

Toute aide serait très appréciée

2
Todd

Oui, JOIN devrait faire l'affaire. Voici ma requête:

$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

Premièrement, je vous suggérerais d’utiliser les normes de codage les plus récentes pour votre requête de base de données, comme indiqué sur la page de documentation.

Vous pouvez réellement tout combiner en 1 requête en utilisant un join et devrait également utiliser #__ comme préfixe de votre base de données qui sera automatiquement remplacé par lc_.

Je ne l'admets pas, je ne suis pas extrêmement confiant en ce qui concerne les jointures, mais essayez ce qui suit:

$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

Votre tâche souhaite une chaîne unique contenant des adresses électroniques séparées par des virgules - SQL peut faire tout cela à votre place et quelques astuces pratiques.

$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();
}

Avec des exemples de données comme ceci:

|  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]    |
---------------------------------------                       ---------------------------

Vous vous attendriez à recevoir les emails de ids: 2,4,5,8,9

  • INNER JOIN est utilisé car les lignes nulles ne sont pas souhaitées.
  • GROUP_CONCAT () est un outil idéal pour coller les valeurs de courrier électronique avec des virgules. Il offre également l'avantage supplémentaire de supprimer les doublons (pour un envoi postal simplifié) et d'alphabétiser (au cas où vous numériseriez manuellement le résultat).
  • loadResult () est la méthode à appeler lorsque votre jeu de résultats est une valeur unique.

La sortie de mon bloc de code est:

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