【问题标题】:SQL Joint 2 table without duplicate rowsSQL Join 2表没有重复行
【发布时间】:2015-04-19 15:55:29
【问题描述】:

我正在尝试合并 2 个没有重复行的表

表 1 - modx_site_content

|id|pagetitle|introtext|pub_date|
---------------------------------
|3635| name1 |texttextt|17.02.2015
|3636| name1 |texttextt|18.02.2015

表 2 - modx_site_tmplvar_contentvalues

|contentid|tmplvarid|value|
---------------------------
|   3635  |    1    |value1
|   3635  |    1    |value2
|   3636  |    1    |value3

我想尽一切办法

|id|title|introtext|publishdate|photo|
--------------------------------------
|3635|name1|texttextt|17.02.2015|value1, value2
|3636|name1|texttextt|18.02.2015|value3

但当前结果显示重复行 id 3535

|id|title|introtext|publishdate|photo|
--------------------------------------
|3635|name1|texttextt|17.02.2015|value1
|3635|name1|texttextt|17.02.2015|value2
|3636|name1|texttextt|18.02.2015|value3

我当前的sql请求是

SELECT 
    modx_site_content.id,
    pagetitle as 'title',
    introtext,
    pub_date as 'publishdate',
    modx_site_tmplvar_contentvalues.value as 'photo' 

FROM `modx_site_content`, 
    `modx_site_tmplvar_contentvalues`

WHERE parent IN (1153,3271) 
    AND pub_date>0
    AND `contentid`= modx_site_content.id
    AND `tmplvarid` IN (10, 15, 19) 

Order by `pub_date` DESC LIMIT 20

【问题讨论】:

  • 您需要在您的select 上加上group bygroup_concat(),并注意您所做的是糟糕的数据库实践。不要使您的设计非规范化。

标签: mysql sql join duplicates rows


【解决方案1】:

MySQL 有 group_concat 可以工作(取决于数据类型):

SELECT 
    modx_site_content.id,
    pagetitle as 'title',
    introtext,
    pub_date as 'publishdate',
    group_concat(modx_site_tmplvar_contentvalues.value) as 'photo' 
FROM `modx_site_content` JOIN
    `modx_site_tmplvar_contentvalues` ON `contentid`= modx_site_content.id
WHERE parent IN (1153,3271) 
    AND pub_date>0
    AND `tmplvarid` IN (10, 15, 19) 
GROUP BY modx_site_content.id, pagetitle , introtext, pub_date

【讨论】:

    【解决方案2】:

    解决您当前问题的方法是group bygroup_concat()

    SELECT c.id, c.pagetitle as title, c.introtext, c.pub_date as publishdate,
           group_concat(cv.value) as sphotos
    FROM `modx_site_content` c JOIN
         `modx_site_tmplvar_contentvalues` cv
         ON cv.`contentid`= c.id
    WHERE c.parent IN (1153, 3271) AND c.pub_date > 0 AND
          `tmplvarid` IN (10, 15, 19) 
    GROUP BY c.id, c.pagetitle, c.introtext, c.pub_date
    Order by c.`pub_date` DESC
    LIMIT 20;
    

    我也会推荐:

    • 使用明确的join 语法。
    • from 子句中定义表别名。
    • 为列引用使用表别名。
    • 不要使用单引号来定义列别名。你不需要一个转义字符,所以不要同时使用一个。

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2017-09-12
      • 2015-07-29
      相关资源
      最近更新 更多