【问题标题】:php, mysql - Select row that have a column with multiple valuesphp, mysql - 选择具有多个值的列的行
【发布时间】:2013-09-25 13:54:36
【问题描述】:

我有以下类型的设置(有点过于简单):

一个数组(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。另请注意,这过于简单化了。

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

【问题讨论】:

    标签: php mysql sql optimization query-optimization


    【解决方案1】:

    如果我错了,请纠正我,你想从 Table 1 中选择所有记录,它的 IDTable 2idT1 字段。如果是这种情况你可以试试

    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 count 为这一行

    HAVING COUNT(DISTINCT table2.value) = 3
    

    这将取代 3

    【讨论】:

    • 没有投反对票,但你弄错了...我需要从 t1 获取所有记录,这些记录在 t2 中有相应的行,这些记录的值放在一起总计该数组...是解释起来有点棘手……
    • ...除了 SQL 注入问题?
    • 此时不要关心注入,解决方案在某种程度上是有效的,因为我没有指定数组可能没有不同的元素(当时我没有想到观点)。不能完全解决我的问题,但只是一个开始,我可以从这里开始,所以...... +1。
    • @symcbean 好吧,我是在假设 zozo 已经知道如何避免 SQL 注入的情况下回答的 :)
    • 是的...这不是问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2012-12-06
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多