2010-11-10 3 views
0

Si j'ai la requête ci-dessous qui sélectionne une carte de forum, mais la table board contient une colonne mirror_board_id. Est-il possible pour moi de modifier une requête de sélection de base à l'endroit où mirror_board_id > 0 que ce sera SELECT * FROM board WHERE board_id = mirror_board_id ou quelque chose. Actuellement, je suis en utilisant 2 requêtes pour cela, mais c'est une requête peu intensive ...Sélection d'une autre ligne basée sur la valeur de la colonne

SELECT * FROM board WHERE category_id = 7 AND board_id = 0 

mise à jour

SELECT * FROM board WHERE category_id = 7 AND 
          (
            (
             mirror_board_id > 0 
             AND board_id = mirror_board_id 
            ) 
           OR board_id = 0 
          ) AND 
          display = 1 ORDER BY `order` ASC 

Ce retourne les mauvais conseils dans la liste, il est pas vraiment retourner les planches miroir, mais planches originales où mirror_board_id > 0

Répondre

4

Logiquement, il est:

SELECT * 
FROM board 
WHERE (mirror_board_id > 0 and board_id = mirror_board_id) 
    or board_id = 0 

On peut écrire plus succinctement:

SELECT * 
FROM board 
WHERE board_id = coalesce(mirror_board_id, 0) 
+0

ce que je pourrais demander l'indexation avec cela pour accélérer? Est-ce que l'indexation de 'board_id' et de' mirror_board_id' séparément serait suffisant? – Webnet

+0

Il n'est pas clair pour moi si les index seraient utiles dans ce cas, puisque vous examinez chaque ligne. Test et voir ... – RedFilter

+0

ça ne fonctionne pas comme je le pensais ... – Webnet

Questions connexes