SQL LEFT JOIN 不重复相同的行值
Posted
技术标签:
【中文标题】SQL LEFT JOIN 不重复相同的行值【英文标题】:SQL LEFT JOIN without duplicating same row values 【发布时间】:2014-10-18 16:54:34 【问题描述】:我想知道是否有人可以帮助我解决以下问题: 我想拉一次属于该posts.text的posts.text和uids,但是当我执行下面的代码时,它会这样做:例如。有 4 个属于帖子的 uid,所以我得到了 posts.text 四次而不是一次。
$query = mysqli_query($con,
"SELECT posts.text, relationships.uidb
FROM posts
LEFT JOIN relationships
ON posts.uid=relationships.uida
LIMIT 10");
if(mysqli_num_rows($query) > 0)
while($row = mysqli_fetch_assoc($query))
echo $row['text']." ".$row['uidb']."<br>";
我非常感谢任何帮助。 谢谢是提前。 彼得
更新: 期望的输出是这样的:
postsArray[0]->text = //post text
postsArray[1]->text = //another post text
postsArray[0]->uids[0] = //approved uid for first post
postsArray[0]->uids[1] = //another approved uid for first post
现在它输出: 文字 10 文本 15 文字 12
我想要这个: 文本 10、15、12
【问题讨论】:
但是有 4 个关系...你想要哪个?如果您想单独加载文本,那么这是可行的,否则这是一个关系数据库,它会返回您所要求的内容。或者,如果您不想要这个,您可以提供一些示例输入数据和所需的输出吗? 那么您是只想要每个text
1 个uidb
(以及哪1 个),还是想要每个text
全部uidb
?
我想要所有 uidb 和一个文本
@peterpetr4 一个帖子可以有多少个 uid,帖子上的最大 uid 数量只是询问
@M Khalid Junaid 帖子可以有无限的 uid,也许我只是不知道如何正确访问输出,因为我想得到这样的输出:postsArray[0].text = post text postsArray[0].uids[1] = uid 号 postsArray[0].uids[2] = 另一个 uid 号
【参考方案1】:
一种方法是使用 Mysql 的 GROUP_CONCAT
,它为每个组提供逗号分隔的值列表,即 (p.uid)
$query = mysqli_query($con,
"SELECT p.text, GROUP_CONCAT(r.uidb SEPARATOR ', ') uidbs
FROM posts p
LEFT JOIN relationships r
ON p.uid=r.uida
GROUP BY p.uid
LIMIT 10");
if (mysqli_num_rows($query) > 0)
while ($row = mysqli_fetch_assoc($query))
echo $row['text'].' '.$row['uidbs'];
/*$uidbs= explode($row['uidbs'],',');
foreach ($uidbs as $key => $val)
echo $val.' ';
*/
echo '</br>';
GROUP_CONCAT
根据 docs 结果被截断为最大长度 由 group_concat_max_len 系统变量给出,它有一个 默认值为 1024。该值可以设置得更高,尽管 返回值的有效最大长度受 max_allowed_packet 的值。
【讨论】:
【参考方案2】:也许这对你有用:
$query = mysqli_query($con,
"SELECT posts.text, relationships.uidb
FROM posts
LEFT JOIN relationships
ON posts.uid=relationships.uida
GROUP BY posts.uid
LIMIT 10");
if(mysqli_num_rows($query) > 0)
while($row = mysqli_fetch_assoc($query))
echo $row['text']." ".$row['uidb']."<br>";
【讨论】:
【参考方案3】:SELECT posts.text, relationships.uidb
FROM posts
LEFT JOIN relationships
ON posts.uid=relationships.uida
GROUP BY posts.primary_key_of_your_post
LIMIT 10
【讨论】:
【参考方案4】:您应该调用 2 个查询。在您的第一个查询中,调用文本,然后调用 uids。
您不应该编写复杂的查询,因为这会使您的业务变得更加复杂,并且您将来不会维护您的代码。
【讨论】:
以上是关于SQL LEFT JOIN 不重复相同的行值的主要内容,如果未能解决你的问题,请参考以下文章