请查看以下查询:
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_comments中选择所有评论
即。你在('%s')
在我的trybes中
即。 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')
你能看出我做错了吗?
由于
答案 0 :(得分:0)
我是个白痴,我正在返回$ result对象而不是我的$ data数据
感谢您发表评论,问题解决了!
答案 1 :(得分:0)
就查询而言,是的。第一个问题:您使用的是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特定的函数。