0

我一直在做一个项目,直到现在只需要从连接表中找到 1 行。但现在我需要抓取多行..

所以就目前而言,我的 sql 的工作方式类似于:

为该特定项目选择每个公司的行,仅此项目就可以找到公司详细信息(姓名、ID、电话……等等)。然后我加入一个表,其中包含为每个公司提交的表单数据(多个表单 - 所以多个记录)

到目前为止,我一直在指定要在联接中查找的一种形式,但现在我需要指定多个形式。

如果我使用WHERE form_id = 1 OR form_id = 2 OR form_id = 3 ...我只得到每个公司找到的第一个表单匹配的结果..

如果我混淆了查询,那么它会查找第一个表单并为每个公司返回具有不同表单数据的多条记录——这在这个意义上是有效的。

但是我随后在视图中循环遍历该数组并为每条记录创建一个表行(以前每行都是一家新公司),但使用后者会导致同一公司显示多条记录。

我有什么办法可以做到这一点?我尝试group by了后一种方法,但这再次导致只有 1 条记录。

    SELECT DISTINCT p.project_company_has_user_id, p.project_company_has_user_project_id, p.project_company_has_user_user_id, c.company_id, c.company_hall_no, c.company_company_name, c.company_type, c.company_country, c.company_stand_number, c.company_image_file_1, p2.project_id, p2.project_name, u.user_id, u.user_username, o.orders_id, o2.order_detail_id, o2.order_detail_product_id, f2.form_question_has_answer_id, f2.form_question_has_answer_request, f2.form_question_has_answer_form_id, f2.form_question_has_answer_user_id 
    FROM project_company_has_user p 
    INNER JOIN company c ON p.project_company_has_user_company_id = c.company_id 
    INNER JOIN project p2 ON p.project_company_has_user_project_id = p2.project_id 
    INNER JOIN user u ON p.project_company_has_user_user_id = u.user_id 
    INNER JOIN form f ON p.project_company_has_user_project_id = f.form_project_id 
    LEFT JOIN orders o ON p.project_company_has_user_user_id = o.orders_user_id 
    LEFT JOIN order_detail o2 ON ((o2.order_detail_orders_id = o.orders_id AND (o2.order_detail_product_id = 65 OR o2.order_detail_product_id = 68 OR o2.order_detail_product_id = 64))) 
    LEFT JOIN form_question_has_answer f2 ON ((f2.form_question_has_answer_form_id = 297 AND f2.form_question_has_answer_user_id = p.project_company_has_user_user_id)) 
    WHERE (f.form_template_name = "custom" AND p.project_company_has_user_garbage_collection = 0 AND p.project_company_has_user_project_id = 48) AND (LCASE(c.company_country) LIKE "%uk%" OR LCASE(c.company_country) LIKE "%uk%") ORDER BY company_company_name asc
4

2 回答 2

1

您需要 order_detail 中的另一个字段作为 o2 。该字段为row_index(position)等定位记录

LEFT JOIN order_detail o2 ON (o2.row_index=1 AND (o2.order_detail_orders_id = o.orders_id AND (o2.order_detail_product_id = 65 OR o2.order_detail_product_id = 68 OR o2.order_detail_product_id = 64))) 
于 2012-04-20T19:35:30.670 回答
0

就我个人而言,我会使用外部联接来列出您需要列出所有匹配项的元素。如果他们需要清理该数据,您可以将逻辑构建到联接条件中(如步骤 2)。根据您正在处理的数据量以及您是否需要稍后在同一个过程中重用它,您可能希望将该主数据集发布到临时表中并将其用作您以后逻辑的源(主)。

希望有帮助。如果您需要代码,请告诉我,但这很简单。

问候

苹果电脑

于 2012-04-20T09:29:50.150 回答