Python SQL-左两个联接

时间:2019-12-02 22:25:01

标签: python mysql sql woocommerce mysql-connector-python

我在使用Python的SQL时遇到了一些问题,希望能对我有所帮助-我正在尝试从wordpress / woocommerce检索一些数据。

我的代码:

    cursor.execute("
    SELECT t1.ID, t1.post_date, t2.meta_value AS first_name, t3.meta_value AS last_name
    FROM test_posts t1 
    LEFT JOIN test_postmeta t2 
    ON t1.ID = t2.post_id 
    WHERE t2.meta_key = '_billing_first_name' and t2.post_id = t1.ID 
    LEFT JOIN test_postmeta t3 
    ON t1.ID = t3.post_id 
    WHERE t3.meta_key = '_billing_last_name' and t3.post_id = t1.ID 
    GROUP BY t1.ID 
    ORDER BY t1.post_date DESC LIMIT 20")

我遇到以下错误:

    mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN test_postmeta t3 ON t1.ID = t3.post_id WHERE t3.meta_key = '_billing' at line 1

我在做什么错了?

谢谢。

2 个答案:

答案 0 :(得分:3)

GROUP BY之前只能有1个WHERE子句。
但是由于使用LEFT联接,所以在{em> right 表上设置条件,例如t2.meta_key = '_billing_first_name',而是获得INNER联接,因为您拒绝不匹配的行。
因此,请在ON子句中设置所有条件:

cursor.execute("
SELECT t1.ID, t1.post_date, t2.meta_value AS first_name, t3.meta_value AS last_name
FROM test_posts t1 
LEFT JOIN test_postmeta t2 
ON t1.ID = t2.post_id AND t2.meta_key = '_billing_first_name'
LEFT JOIN test_postmeta t3 
ON t1.ID = t3.post_id AND t3.meta_key = '_billing_last_name'
GROUP BY t1.ID 
ORDER BY t1.post_date DESC LIMIT 20")

尽管此查询在语法上对于MySql可能是正确的,但由于您不进行任何聚合,因此使用GROUP BY没有意义。

答案 1 :(得分:2)

您的SQL语法不正确。试试这个:

  cursor.execute("
    SELECT t1.ID, t1.post_date, t2.meta_value AS first_name, t3.meta_value AS last_name
    FROM test_posts t1 
    LEFT JOIN test_postmeta t2 ON t1.ID = t2.post_id 
    LEFT JOIN test_postmeta t3  ON t1.ID = t3.post_id 
    WHERE t3.meta_key = '_billing_last_name' and t2.meta_key = '_billing_first_name'
    GROUP BY t1.ID 
    ORDER BY t1.post_date DESC LIMIT 20")

值得一读有关SQL JoinsWHERE语句的信息。