在查询中使用结果

时间:2019-04-29 15:14:22

标签: php sql

您好,我试图在我的网站上显示群组名称,但无法同时连接两个查询。用户类在用户表中,而组名在组表中。

我设法从用户​​表中显示班级用户号,我现在只需要添加第二个查询即可从组中提取组名

这适用于用户的班级编号

        $res3 = SQL_Query_exec("SELECT class FROM `users` WHERE id=$posterrid ");
        $arr3 = mysqli_fetch_row($res3);
        $group = $arr3[0];

应该是

        $res3 = SQL_Query_exec("SELECT class FROM `users` WHERE id=$posterrid ");
        $res4 = SQL_Query_exec("SELECT level FROM `groups` WHERE group_id=$res3 ");
        $arr3 = mysqli_fetch_row($res4);
        $group = $arr3;

3 个答案:

答案 0 :(得分:2)

我会尝试加入表并直接在1个查询中选择所需的结果。像这样:

"SELECT groups.level FROM groups JOIN users ON groups.group_id=users.class WHERE users.id=$posterrid"

您也可以在2个查询中执行此操作,但是在您的第二个代码段中,第二个查询将$ res3作为参数。 $ res3不是字符串,这就是为什么$ res4 ..行未提供所需结果的原因。您需要先获取结果字符串($ group),然后在第二个查询中使用它。

答案 1 :(得分:0)

过时的请使用联接(In MySQL queries, why use join instead of where?

就像@Shadol说的那样,您可以直接组合这两个查询。但我会这样:

WordTable = {
  {lv = 1, v_random = "LEOHL", v_word = "HELLO"},
  {lv = 1, v_random = "GEEINN", v_word = "ENGINE"},
  {lv = 1, v_random = "TECHA", v_word = "CHEAT"},
  {lv = 2, v_random = "dwIl prEARmgorm", v_word = "WILD PROGRAMMER"},
  {lv = 2, v_random = "abDEKory deEPRss", v_word = "KEYBOARD PRESSED"},
 }

function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

function getTypingWord()
 local score = 0
 local point = 0
 index = 1
 count = tablelength(WordTable)
 tab = WordTable[index]

 for index=1,count do
 local rdmWord = tab.v_random
 local crtWord = tab.v_word
 labelWrd.Caption = rdmWord

 local mcWord = string.upper(edtWrd.Text)
 -- edtWrd is a text box

 if mcWord == '' or mcWord == nil then return nil end

 if mcWord == crtWord then
  showMessage('Great, the answer is '..crtWord)
  edtWrd.Text = ''
  point = point+1
  score = point*200
  labelLevel.Caption = 'True : '..point  -- a label
  labelScore.Caption = 'Score : '..score -- a label
  index = index + 1
  tab = WordTable[index]
 else
  showMessage('Try Again')
  edtWrd.Text = ''
 end
 end
end

-- wait user answer till ENTER key has pressed
edtWrd.OnKeyPress = function(sender, key)
if isKeyPressed(VK_RETURN) then getTypingWord() end
 return key
end

答案 2 :(得分:0)

这不是正确的方法。您应该执行将用户表和组表联接在一起的单个查询,以便通过单个查询即可获得结果集中所需的数据。

您的问题没有提供诸如表结构之类的重要信息,因此我必须做出有根据的猜测。我必须做的假设:

  • users.class是groups.group_id的外键
  • groups.level实际上是“组名”
顺便说一句,外键的命名(重新)非常令人困惑。当您可以为列group_id命名时,这对于试图弄清表之间的关系以使用完全不同的名称(“类”)的人没有帮助。

因此,要在一个查询中获取此信息:

SQL_Query_exec("SELECT g.level as level
                FROM `users` u JOIN `groups` g ON (g.group_id = u.class)
                WHERE id = $posterrid");

您的主要收获应该是:

您将受益于研究关系数据库设计/数据库规范化以及如何将表连接在一起。

此外,您正在使用的任何数据库类都是过时的,这使您面临SQL注入和转义问题。

您不应将字符串插值用于查询,而应使用参数和预准备语句。