php - MySQL 查询根据特定标记组合在获取行时返回不需要的行

标签 php mysql sql

我在 Windows 8 PC 上运行 PHP+MySQL。我有一个表mytable,如下所示;

╔═════════╦══════╦═════╗
║ product ║ tag  ║ lot ║
╠═════════╬══════╬═════╣
║ 1111    ║ 101  ║ 2   ║ 
║ 1111    ║ 102  ║ 5   ║ 
║ 2222    ║ 103  ║ 6   ║ 
║ 3333    ║ 104  ║ 2   ║  
║ 4444    ║ 101  ║ 2   ║ 
║ 5555    ║ 101  ║ 2   ║ 
║ 5555    ║ 102  ║ 5   ║ 
║ 6666    ║ 102  ║ 2   ║ 
║ 6666    ║ 103  ║ 5   ║
║ 7777    ║ 101  ║ 2   ║ 
║ 7777    ║ 102  ║ 5   ║ 
║ 7777    ║ 103  ║ 6   ║ 
║ 8888    ║ 101  ║ 1   ║ 
║ 8888    ║ 102  ║ 3   ║ 
║ 8888    ║ 103  ║ 5   ║ 
║ 9999    ║ 101  ║ 6   ║ 
║ 9999    ║ 102  ║ 8   ║
╚═════════╩══════╩═════╝

我有输入 101,102。我想要这样的输出;

2,5
6,8

查询将查找组合 101,102,并返回具有不同批号完全相同的组合。除此之外,我想避免重复的行。这里 11115555 具有与 tag 相同的对应批号的相同标签(具有相同批处理的完全相同的组合),所以我只想要一个行而不是 2 行。尽管 8888 的标签 101102lot 不同,但它不能考虑上市,因为此外,它还包含标签 103。简而言之,我想要具有精确 101、102 组合的产品,我不想要带有任何额外标签的产品,我不想要任何缺少标签的产品。

我有如下查询;

SELECT DISTINCT GROUP_CONCAT(m.lot) FROM mytable m
WHERE m.tag IN (101,102) 
AND (SELECT COUNT(m.product) FROM mytable m2 WHERE m.product = m2.product)>1
GROUP BY m.product;

返回;

2,5
2
5,2
1,3
6,8

我该如何解决这个问题?有没有更好的方法来完成我正在寻找的东西?

这是以 http://sqlfiddle.com/#!9/d11d6 开始的 fiddle

最佳答案

我建议为此使用简单连接:

SELECT DISTINCT a.lot, b.lot
FROM mytable a
    INNER JOIN mytable b ON b.product = a.product AND NOT EXISTS (SELECT * FROM product WHERE tag NOT IN (a.tag, b.tag))
WHERE a.tag = 101 and b.tag = 102

关于php - MySQL 查询根据特定标记组合在获取行时返回不需要的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34885425/

相关文章:

php - 有没有办法确定自动运行脚本所需的最低 PHP 版本?

php - 如何在 Laravel 测试中代表另一个 session 发出 HTTP 请求?

mysql - MySQL View 是在文件系统上创建和存储的,还是总是在运行时创建的

mysql - 用于航空公司预订应用程序的动态结构化 mySQL 数据库

php - 如何使用 GuzzleHttp/cURL 指定公共(public)证书

php - 现在(对于动态站点)不依赖像 memcached 这样的缓存系统是不是很疯狂?

mysql - 从数据透视表返回单行

c# - 使用 WCF 数据服务将一个数据库表复制到另一个数据库表

mysql - 如何使用 codeigniter 事件记录模式将行转换为列?

php - 使用 php 变量创建动态 mysql 查询