【问题标题】:Is there anything wrong with this mysql query?这个mysql查询有什么问题吗?
【发布时间】:2014-05-02 13:25:19
【问题描述】:

请查看以下查询:

SELECT tc.registered, t.id, u.x_account_username
                        FROM x_trybe_comments tc
                        LEFT JOIN x_user u
                        ON tc.profile_id = u.id
                        LEFT JOIN x_trybes t
                        ON tc.trybe_id = t.id
                        WHERE u.id IN ('%s')
                        AND tc.trybe_id IN ('%s')

$query      =   sprintf($query, $contacts, $trybes);

我正在尝试从我的联系人 x_trybe_cmets 中选择所有 cmets

即u.id IN ('%s')

在我的尝试中

即tc.trybe_id IN ('%s')

“%s”被替换为 implode() 的数组。

我从以下两个函数中获取数组:

    $contacts = getContactIds($db,$profile_id);
    $trybes = getTrybesJoinedOrOwned($db,$profile_id);
    $contacts = implode("', '", $contacts);
    $trybes = implode("', '", $trybes);

试用和联系人的输出:

Trybes: c341f36cc31c7e22c4ec00fd484c1fc03a7b2dfd', 'baa764365ac0a4ba044651ca46b08aa8de74e288', 'a9f4fba45750075eccda69f6645d6240c8889b10', '4ce48a7c7c21f82dc632bde72305d1330e1ac28 

Contacts: 1dd36ac747735a3ee8a1d47750e1515ab7ac0d53', 'dc19818afa52859032bdde290b900e3763ba54d0', '397cde4302885e167004494340971f4550346e04', 'c73fb8efa74354e721a5a945a5c367f486a3d80b', 'c484c72086ed2fdbd859954a2a753b07c4bd1f1d

以下是相关查询的回声:

SELECT tc.registered, t.id, u.x_account_username
                        FROM x_trybe_comments tc
                        LEFT JOIN x_user u
                        ON tc.profile_id = u.id
                        LEFT JOIN x_trybes t
                        ON tc.trybe_id = t.id
                        WHERE u.id IN ('1dd36ac747735a3ee8a1d47750e1515ab7ac0d53', 'dc19818afa52859032bdde290b900e3763ba54d0', '397cde4302885e167004494340971f4550346e04', 'c73fb8efa74354e721a5a945a5c367f486a3d80b', 'c484c72086ed2fdbd859954a2a753b07c4bd1f1d')
                        AND tc.trybe_id IN ('c341f36cc31c7e22c4ec00fd484c1fc03a7b2dfd', 'baa764365ac0a4ba044651ca46b08aa8de74e288', 'a9f4fba45750075eccda69f6645d6240c8889b10', '4ce48a7c7c21f82dc632bde72305d1330e1ac280', '408032a6043f6789083c4919474969f6d47abb1c', 'f8fbf59d242794cc6c00932a8ef643587338d189', '76fb8332f5808111f6e83e5a8f9068ff911850e5', 'd62243e0026e8d4c48143549b421e492ba1a840f', '580861afde002c536466db9ae953e43c47b3eeab', 'faebdc82b8bcf8fbb5db56c3c3b805f3e1fda5a2', '297cebfa7522e253d65d1fd6f5f904ca5b626905')

你能看出我做错了什么吗?

谢谢

【问题讨论】:

  • 你能展示你的内爆声明吗?
  • @choult 查看问题底部的内爆语句
  • $trybes、$contacts 变量的echo 是...?还有 SQL 查询本身 - 我怀疑查询本身不是在没有语法错误的情况下构建的。
  • @bodi0 现在为 trybes 和联系人添加输出,请参阅问题底部
  • 您的查询看起来不错。如果您没有得到任何结果,那么您没有符合谓词的记录。

标签: php mysql left-join


【解决方案1】:

我是个白痴,我返回的是 $result 对象而不是我的 $array 数据

感谢评论,问题解决了!

【讨论】:

    【解决方案2】:

    就查询而言,是的。第一个问题:您正在使用left join,但where 条件正在撤消left join,将其变成仅仅是inner join。问题是列值在不匹配的行中为NULL,而where 子句没有考虑到这一点。

    正确的解决方案是将条件移至on 子句:

    SELECT tc.registered, t.id, u.x_account_username
    FROM x_trybe_comments tc LEFT JOIN
         x_user u
         ON tc.profile_id = u.id AND u.id IN ('%s') LEFT JOIN
         x_trybes t
         ON tc.trybe_id = t.id AND tc.trybe_id IN ('%s');
    

    或者,如果你真的是指INNER JOIN,这似乎很可能:

    SELECT tc.registered, t.id, u.x_account_username
    FROM x_trybe_comments tc INNER JOIN
         x_user u
         ON tc.profile_id = u.id INNER JOIN
         x_trybes t
         ON tc.trybe_id = t.id 
    WHERE u.id IN ('%s') AND tc.trybe_id IN ('%s');
    

    下一个问题是in 条件仅适用于一个值。 in ('2,3') 与 in (2,3) 不同。解决此问题的一种方法是将值放入查询中。另一种是使用find_in_set():

    SELECT tc.registered, t.id, u.x_account_username
    FROM x_trybe_comments tc INNER JOIN
         x_user u
         ON tc.profile_id = u.id INNER JOIN
         x_trybes t
         ON tc.trybe_id = t.id 
    WHERE find_in_set(u.id, '%s') AND find_in_set(tc.trybe_id, '%s');
    

    我认为find_in_set() 是快速/肮脏的解决方案。实际上修复查询更好,因为它可以使用索引而不使用 MySQL 特定的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多