【问题标题】:Filtering rows in mysql with possibility for more values [closed]过滤mysql中的行,有可能获得更多值[关闭]
【发布时间】:2020-06-24 17:30:56
【问题描述】:

我是 PHP 和 MySQL 的新手,但遇到了一些问题。

例如,在这里我想显示所有可以使用 Wordpress、Joomla 和 Typo3 的人...在这种情况下,它应该只显示 Mustermann 夫人 我尝试了 WHERE name='joomla' OR name='wordpress' OR name='typo3',但它显示了可以与这三个中的任何一个一起工作的人......对不起我的英语不好


编辑

OP 说明:提供示例数据很难,无论发布图片有多“容易”

 nachname    vorname  email                name        id
 ---------   -------  -------------------  ---------- --- 
 Mustermann  Mrs                           joomla     148 
 Mustermann  Mrs                           wordpress  148 
 Mustermann  Mrs                           typo3      148 
 Mustermann  Muster   mustermann@gmail.de  wordpress  158 
 Mustermann  Muster   mustermann@gmail.de  typo3      158

SELECT t.*
  FROM ( SELECT 'Mustermann' AS nachname,'Mrs' AS vorname,'' AS email,'joomla' AS NAME,'148' AS id
         UNION ALL SELECT 'Mustermann','Mrs','','wordpress','148'
         UNION ALL SELECT 'Mustermann','Mrs','','typo3','148'
         UNION ALL SELECT 'Mustermann','Muster','mustermann@gmail.de','wordpress','158'
         UNION ALL SELECT 'Mustermann','Muster','mustermann@gmail.de','typo3','158'
       ) t

【问题讨论】:

  • 将来自 mysql 的示例数据作为屏幕截图发布可能对您来说更容易,但对其他人来说肯定更容易。 meta.stackoverflow.com/questions/285551/… 如果将示例 SQL WHERE 条件格式化为代码,对读者来说会容易得多
  • 对我来说,用截图更容易解释我们不是靠照片治愈的。 CREATE TABLE + INSERT INTO 是安全的。
  • 对不起... code($query = "SELECT nachname, vorname, email, name, user.id FROM user LEFT JOIN userskill ON user.id = userskill.userid LEFT JOIN Skill ON userskill .skillid=skill.id";)

标签: php mysql sql group-by row


【解决方案1】:

你可以使用下一个查询来解决你的问题:

SELECT 
    nachname, vorname, email, 
    CONCAT(s1.name,' ', s2.name,' ', s3.name) as skills,
    user.id 
FROM user 
JOIN userskill ON user.id = userskill.userid 
-- each of joins filter by demand skillname
JOIN skill s1 ON userskill.skillid=s1.id and s1.name = 'Wordpress'
JOIN skill s2 ON userskill.skillid=s1.id and s2.name = 'Joomla'
JOIN skill s3 ON userskill.skillid=s1.id and s3.name = 'Typo3'
;

【讨论】:

    【解决方案2】:

    典型的解决方案是使用group by 聚合具有相同nachname 的行,然后使用having 子句进行过滤:

    select nachname
    from mytable
    where name in ('joomla', 'wordpress', 'typo3')
    group by id, nachname
    having count(distinct name) = 3
    

    我假设idnachname 的唯一标识符,所以我将它添加到group by 子句中;如果不是这种情况,请随意删除它。

    此查询为您提供了对in 列表中的所有三个值都有效的nachnames。

    通过修改in 列表和目标计数,很容易使查询适应更多(或更少)names。

    如果表中没有重复的(nachname, name)重复,可以用count(*)代替count(distinct ...),这样效率会更高。

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 2018-04-21
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      相关资源
      最近更新 更多