【问题标题】:PHP MySQL - Select members with where-clause statements from different tablesPHP MySQL - 从不同的表中选择带有 where 子句语句的成员
【发布时间】:2013-02-04 11:38:11
【问题描述】:

我现在大部分时间都在谷歌上搜索,但我似乎找不到正确的答案。也许是因为我真的不知道往哪个方向看(加入?存在?)。我有 3 张桌子:


有一个名为“groups”和“languages”的表,其中包含实际的组和语言数据,但现在这并不重要。

用户应该能够根据所选组和/或语言生成包含所有成员的列表。用户选择的组/语言保存在两个单独的数组中,其中包含 ID($aGroups$aLangs)。

我想要/需要的是SELECT * FROM members WHERE ...

这就是我卡住的地方。我试过加入,我试过IN(),我试过EXIST,但似乎没有任何效果。

非常感谢任何帮助!

【问题讨论】:

    标签: php mysql sql select


    【解决方案1】:

    如果你想按语言和组选择成员,你可以这样做:

    $query = "select * from members as m 
    left join group_members as gm on gm.member_id = m.id 
    left join language_members as lm on lm.member_id = m.id";
    if(isset($aGroups)) {
      $query .= " where group_id in (".implode(",", $aGroups).")";
      if(isset($aLangs)) {
        $query .= " and language_id in (".implode(",", $aLangs).")";
      }
    } 
    elseif(isset($aLangs)) {
      $query .= " where language_id in (".implode(",", $aLangs).")";
    }
    

    【讨论】:

    • 这在大多数情况下都很好用。但有一件事:一些记录(成员)出现两次(或更多)。我很确定这与一些成员会说两种或多种语言的事实有关。或者是 2 个或更多组的成员。你也知道如何解决这个问题吗?
    • 好吧,也许我应该在发表评论之前先用 Google 搜索一下。我在最后添加了GROUP BY m.id。效果很好!这也是最好的方法吗?或者还有其他我应该知道的方法吗?无论哪种方式,我都会标记您的答案。谢谢你的帮助! (这也适用于其他答案!)
    • @svdv22 如果你只需要 id,你可以使用“select distinct m.id from ...”。如果是这种情况,“分组依据”将给出相同的结果。
    • 不,还需要名称,所以按 GROUP BY。感谢您的帮助。
    【解决方案2】:

    我认为你只需要一些括号:

    //assuming you have ids stored in $lang and $group
    SELECT * FROM members WHERE (SELECT group_id FROM group_members WHERE member_id=members.id)='$group'
    AND (SELECT lang_id FROM language_members WHERE member_id=members.id)='$lang' 
    

    诀窍是“members.id”,DB 会为每个成员调用子查询,以确定是否满足 group 和 lang 的条件。

    【讨论】:

    • 你应该总是尽量避免在mysql中使用嵌套查询。
    • @svdv22 完全正确。如果你想了解更多信息,你可以谷歌mysql nested queries。您也可以在 StackOverflow 上找到很多问题和答案。
    【解决方案3】:
    Select m.* FROM members m, group_members gm, language_members lm
    WHERE
    lm.member_id=m.id AND
    m.id=gm.member_id AND
    <<<< START YOUR OWN WHERE HERE.
    

    【讨论】:

    • 不,这与进行左连接不同,而是进行内连接
    • @leson Sonesson:既然你删除了你的评论,我的评论看起来很奇怪;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多