【问题标题】:How do I query mysql data with array如何使用数组查询mysql数据
【发布时间】:2011-09-26 19:53:45
【问题描述】:

我有两张桌子colorcode & users

colorcode

ID colorid  colorname
------------------------
1  1        yellow
2  2        black
3  3        red
4  4        white

users

ID userid  colorid
------------------------
1  1        1,2
2  2        3,4
3  3        1,3,4
4  4        1

如何检索和查询个人colorid

$aa = $db->query("SELECT * FROM colorcode"); 
$colors = array();
   while ($colordata = mysql_fetch_assoc($aa)) {
   $colors[] = $colordata["colorid"];
}

假设我想查询哪些用户有yellow 颜色以及我应该为users 使用什么语句

SELECT .. FROM users
WHERE colorid ....

【问题讨论】:

  • 你应该normalize你的users表。创建一个名为user_colors 的新关系表,因为按照您的方式,它甚至不在1NF 中。
  • 你应该改变你的结构。存储逗号分隔值导致的麻烦远比它解决的问题多。 @Shef 感谢 A Level 计算,我知道 1NF 是什么。万岁!
  • 顺便说一下,如果“userid”和“colorid”可以用作唯一标识符的主键,则表不需要使用名为“ID”的列。

标签: php mysql


【解决方案1】:

这是一个糟糕的设计......因为您试图访问用户表中的各个 color_ids,但已将它们存储为逗号分隔的列表,所以您无法让数据库为您执行正常连接 - 您通过使数据库无法为您进行关联,已经扼杀了使用关系数据库的要点。

不过,既然您使用的是 mysql,那么您很幸运 - mysql 有一个功能可以处理这样的情况:

SELECT users.ID, userid, GROUP_CONCAT(colorcode.colorname)
FROM users
LEFT JOIN colorcode ON FIND_IN_SET(colorcode.ID, users.colorid)
GROUP BY users.id

【讨论】:

    【解决方案2】:
    SELECT * FROM users
    WHERE colorid LIKE "%1%"
    

    但是我真正要做的是制作一个从用户到颜色的链接表:

    usersToColors:

    ID userid  colorid
    ------------------------
    1  1        1
    2  1        2
    3  2        3
    4  2        4
    ...
    

    那么你可以这样做:

    SELECT * FROM users u, usersToColors utc
    WHERE u.userid = utc.userid 
          AND utc.colorid = 1;
    

    甚至:

    SELECT * FROM users u, usersToColors utc, colors c
    WHERE u.userid = utc.userid 
          AND utc.colorid = c.colorid
          AND c.colorname = "yellow";
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2013-06-29
      • 2014-06-01
      • 1970-01-01
      • 2017-12-11
      • 2018-04-18
      • 2010-11-09
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多