带有后备(COALESCE)和JOINS的MySQL查询

时间:2013-12-11 22:04:40

标签: php mysql

所以我很难尝试为此编写单个查询。我有一个表格,我们称之为table_a。我需要提取符合特定条件的单个记录。如果第一个没有产生任何东西然后再回到另一个。我已经在这一段时间了,很可能是一件简单的事情,我只是缺席了。

SELECT  COALESCE(ta.id,tb.id,0) AS theid,
FROM table_a
RIGHT JOIN (
    SELECT table_a.id
    FROM table_a
    WHERE table_a.field_3='1' AND table_a.field_4='100' AND table_a.user_id='someidhere'
) AS ta
ON table_a.id = ta.id

RIGHT JOIN (
    SELECT table_a.id
    FROM table_a
    WHERE table_a.field_5='2' AND table_a.field_4='100' AND table_a.user_id='someidhere'
) AS tb
ON table_a.id = tb.id

RIGHT JOIN的问题是如果第一个没有产生记录它不会继续下一个,如果我做LEFT JOIN它会从table_a中提取所有记录,如果我指定WHERE table_a.user_id = 'someidhere'显然会为该用户提取所有记录。我只想找一个。基本上只有field_3和field_5才会改变。如果我找不到field_3的东西,它会移动到field_5。这将在具有80k记录的表上运行。想法?

1 个答案:

答案 0 :(得分:0)

虽然一个新手,从一个神秘的例子开始并不是最好的,但我在这里尝试。您的查询本身对它正在做的事情毫无意义。它加入自身最终获取某个用户ID和字段4值的ID,但字段3或5应分别为1或2。

所以,我已经将查询直接写入" a"用户ID和字段4的表,无论你的右连接都是常见的...然后为你的字段3和5列添加了(OR)。这样,我只关心具有相同用户/字段4区域的3 OR 5值。 ORDER BY子句将强制首先对字段3值为1的任何记录进行排序,然后任何字段5 = 2的记录将是次要的......所以最后的第一个记录将是' 1'如果存在,则进入。

SELECT
      table_a.id
   FROM 
      table_a
   where 
          table_a.user_id = 'someidhere'
      AND table_a.field_4 = '100'
      AND (   table_a.field_3 = '1'
           OR table_a.field_5 = '2' )
   order by
      case when table_a.field_3 = '1' 
           then 1 else 2 end

因此,如果返回了多条记录,您只需关心返回的第一条记录(如果有两条记录符合条件)。