我有以下类型的设置(有点简化):

数组(php):array('a','b','c');

表1:id,其值为(1),(2),(3),(其他)。

表2:ididT1value的值分别为(1、1,'a'),(2、1,'b'),(3、1,'c'),(4、2 ,'c'),(5,77,'w')(其他)。

我需要从表1中选择与表2中具有对应关系的行,该行具有数组中的所有值(在这种情况下,id col = 1的行)。

一种方法是这样的(忽略可能的错别字)

 <?php
      $query = "SELECT * FROM `table1` WHERE `id` IN ";
      $subqr = "";
      foreach ($arr as $a) {
          if (!$subqr)
              $subqr = "(SELECT `idT1` FROM `table2` WHERE `value` = '$a')";
          else
              $subqr .= " AND `id` IN (SELECT `idT1` FROM `table2` WHERE `value` = '$a')";
      }

      ExecuteQuery($query.$subqr); // Where ExecuteQuery gets query as param.


现在我的问题是...我对解决方案并不完全满意...我的意思是...添加子查询的foreach可能不是最好的方法。如果数组有9999个元素... 9999个子查询将杀死mysql。还请记住,这过于简单了。

还有其他想法如何做到这一点?

最佳答案

如果我错了,请纠正我,您想从表1中选择所有记录,这些记录的ID在表2中的IDT1字段中。如果是这样,您可以尝试

SELECT id
FROM table1
LEFT OUTER JOIN table2
ON table1.id=table2.idT1;


编辑:

SELECT *
FROM table1
INNER JOIN table2
ON table1.id=table2.idT1
WHERE table2.value IN ('a','b','c')
GROUP BY table1.id
HAVING COUNT(DISTINCT table2.value) = 3


所以首先,您需要使用php implode将数组插入行

WHERE table2.value IN ('a','b','c')


然后PHP计数这一行

HAVING COUNT(DISTINCT table2.value) = 3


那将取代3

关于php - php,mysql-选择具有包含多个值的列的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18912327/

10-11 02:07
查看更多