web-dev-qa-db-ja.com

最初の結果に基づいて複数のデータベーステーブルからデータを取得する

グループの一部であるユーザーからユーザーIDを取得しようとしています。次に、それらのユーザーIDを取得して、それらのユーザーIDのメールアドレスを取得する必要があります。結果はカンマで区切る必要があります。私が最初にこれを試みたとき、私はユーザーIDが必要だと思ったので、以下を書きました。これはうまく機能し、すべてのIDをコンマ区切りのリストで提供します。以下のクエリの結果を使用してデータベースから電子メールアドレスを取得する方法に困惑していますlc_users WHERE 'id' =以下のクエリの結果

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

どんな助けでも大歓迎です

2
Todd

はい、JOINはトリックを行う必要があります。これが私のクエリです:

$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

まず、ドキュメントページに示されているように、データベースクエリに最新のコーディング標準を使用することをお勧めします。

実際には、joinを使用してすべてを1つのクエリに結合できます。また、#__をデータベースプレフィックスとして使用し、自動的にlc_に置き換えます。

結合には自信がありませんが、認めますが、次のことを試してみます。

$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

あなたのタスクは、コンマ区切りの電子メールアドレスを含む単一の文字列を望んでいます-SQLはそれらすべてに加えていくつかの便利な繁栄を行うことができます。

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

次のようなサンプルデータを使用します。

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

次のIDからのメールを期待しています:2,4,5,8,9

  • INNER JOIN は、null行が望ましくないために使用されます。
  • GROUP_CONCAT() は、Eメールの値をコンマで結合するのに最適なツールです。また、重複を削除する(合理化されたメール送信の場合)およびアルファベット順(手動で出力をスキャンする場合)の追加の利点も提供します。
  • loadResult() は、結果セットが単一の値である場合に呼び出すメソッドです。

私のコードブロックからの出力は次のとおりです。

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