MySQL:你可以根据第三个表中字段的值来选择从哪个表中选择吗


MySQL: Can you choose which table to select from based on the value of a field in a third table?

我有两个表(活动和问题)。

活动表:

+-------------+------------+------------+
| activity_id | title      | flow       |
+-------------+------------+------------+
| 1           | Activity 1 | question-2 |
+-------------+------------+------------+
| 2           | Activity 2 | activity-3 |
+-------------+------------+------------+

问题表:

+-------------+-----------------+------------+
| question_id | question        | flow       |
+-------------+-----------------+------------+
| 1           | Lorem ipsum...? | activity-1 |
+-------------+-----------------+------------+
| 2           | Lorem ipsum...? | question-3 |
+-------------+-----------------+------------+
| 3           | Lorem ipsum...? | activity-2 |
+-------------+-----------------+------------+

我想做的是,如果我想在某个问题或活动之后查找用户的流动位置,然后在一个查询中查找该问题或活动数据,我该如何做到这一点?

MySQL中有没有一种方法可以分析流场并从相应的表和id中提取数据。

因此,例如,如果我知道用户正在回答问题2(question_id:2),并且我想查找问题2之后的项目的标题/问题和流字段(在本例中为问题3(流:问题-3)),我将如何在一个查询中做到这一点。

我希望这是从那以后。我可以告诉MySQL,如果它在流字段中找到activity-1,那么它需要在activities表中查找activity 1的信息。如果在流程字段中找到问题1,则在问题表中查找问题1的信息。

如果可能的话,像这样的复杂查询是否比从PHPPDO运行两个查询更好?查找流字段,然后在PHP中分析它,并使用第二个查询来获取流字段活动或问题数据,这会更优化吗?

如果您当前有问题,这将返回您下一步的位置:

SELECT q.flow next, a.title text, a.flow
FROM activities a
JOIN questions q ON CONCAT('activity-', a.activity_id) = q.flow
WHERE q.question_id = $current_question
UNION ALL
SELECT q2.flow next, q1.question text, q1.flow
FROM questions q1
JOIN questions q2 ON CONCAT('question-', q1.question_id) = q2.flow
WHERE q.question_id = $current_question

演示

如果你目前正在进行一项活动,你可以交换所有问题和活动:

SELECT a.flow next, q.question text, q.flow
FROM questions q
JOIN activities a ON CONCAT('question-', q.question_id) = a.flow
WHERE a.activity_id = $current_activity
UNION ALL
SELECT a2.flow next, a1.title text, a2.flow
FROM activities a1
JOIN activities a2 ON CONCAT('activity-', a1.activity_id) = a2.flow
WHERE a.activity_id = $current_activity

您可以使用UNION SELECT

SELECT 'activity-' + activity_id as id, title, flow FROM activities
UNION SELECT 'question-' + question_id, question, flow FROM questions

并使用CCD_ 1引用同一(UNION)表

中的CCD_