【问题标题】:listing all contents of a member in 2 tables (questions, answers)在 2 个表格中列出成员的所有内容(问题、答案)
【发布时间】:2014-04-03 04:29:52
【问题描述】:

想要列出个人的所有问题和所有答案。
我不知道我应该使用还是内部选择。

Tbquestions
id - 成员 - 问题 - 标题

Tbanswers
id - 成员 - 答案 - 标题

只需要获取每个表的标题

【问题讨论】:

  • 但我使用的是内部选择还是简单选择?
  • 使用简单选择。它更快,更重要的是对您的数据库来说成本更低。
  • 表格中的数据样本和预期结果集的示例将有助于回答您的问题。通常,对于 JOIN 操作,我们希望表之间存在外键关系。通常,我们希望 id 列是主键,而不是期望它们匹配。我们期望每个表中的成员有多个行,成员上的 JOIN 会产生叉积,Tbquestions 中的每一行都与 Tbanswers 中的每一行匹配,这是一个可能有很多重复项的大型结果集。
  • 我想列出用户提出的问题和他给出的答案
  • @Papa Charlie:你想在问题和答案之间进行任何形式的“匹配”,你想为每个问题返回一个特定的答案,还是只是将每个问题与每个答案匹配?如果您只想组合两个列表,那么可以使用 UNION ALL 集合运算符组合两个查询。

标签: php mysql select inner-join


【解决方案1】:

试试这个查询:

SELECT id,member,'Q' as Type, question as QA FROM Tbquestions
WHERE member='member1'
UNION ALL
SELECT id,member,'A' as Type, answer as QA FROM Tbanswers
WHERE member='member1'

样本输出:

id   member   Type   QA
1    Name1    Q      What is it?
3    Name4    Q      Who are you?
1    Name2    A      My name is Name2
4    Name3    A      He is dead, Jim.

编辑

为每个查询添加了Limit 子句,以找到 5 个问题和 10 个答案:

SELECT id,member,'Q' as Type, question as QA FROM Tbquestions
WHERE member='member1' LIMIT 5
UNION ALL
SELECT id,member,'A' as Type, answer as QA FROM Tbanswers
WHERE member='member1' LIMIT 10

【讨论】:

  • @r3wt: 浪费数据库资源?这就是 union all 的用途。
  • +1。对于这样的查询,我通常会包含一个鉴别器列,第一个 SELECT 返回'Q' AS src,第二个查询返回一个'A',所以我们知道一行来自哪个源。
  • @spencer7593:好建议,我的朋友。添加到我的答案中。谢谢。
  • @PapaCharlie:如果您只需要从每个表中返回“标题”,则可以将对 idmemberquestion/answer 的引用替换为 @ 987654331@。 (正如我在之前的评论中所指出的,我通常会包含一个在每个查询中都不同的鉴别器列(字面值),这样我就可以知道哪个源查询返回了该行。这对您来说可能并不重要;这不是必需的,但是在某些情况下它可能很有用。
  • 您想limit 回答 x 个问题和 y 个答案?然后也添加限制子句。
【解决方案2】:

如果问题和相应答案之间存在关系,则应进行连接。 由于这些表是通过成员 id 关联的,我认为不应该使用 join。而是使用 UNION ALL 从两个表中进行简单的选择和组合结果集

【讨论】:

  • 作为愤怒公牛的回应?
  • 你能举个简单的例子吗?
  • @r3wt: 浪费数据库资源?这就是 union all 的用途。
  • 是的,这本书就是这么告诉你的。Raging bull.i 可能完全错误,但我认为你应该只使用简单的查询,然后使用 php 从那里完成工作。
  • @mhasan:好吧,你不应该得到-1。 :-)
【解决方案3】:
global $mysqli;

$stmt = $mysqli->prepare("SELECT title from Tbquestions WHERE member = ?");
$stmt->bind_param('s',$member);
if($stmt->execute()){
$stmt->bind_result($questions);
$stmt->close();
}
$stmt = $mysqli->prepare("SELECT title from Tbanswers WHERE member = ?");
$stmt->bind_param('s',$member);
if($stmt->execute()){
$stmt->bind_result($answers);
$stmt->close();
}
$allposts = array_merge($questions, $answers);
echo '<pre>';
print_r($allposts, false);

【讨论】:

  • 我们很抱歉,但这有点明显......我的疑问是预约而不是两个
  • 没问题,只是用一个查询来解决问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2021-09-13
相关资源
最近更新 更多