2015-05-28 3 views
1

У меня есть две таблицы.Проблема с UNION в MySQL

rp_format

+-----+--+--------------+ 
| fid | | recordformat | 
+-----+--+--------------+ 
| 1 | | CD   | 
| 2 | | Vinyl  | 
| 3 | | DVD   | 
+-----+--+--------------+ 

rp_records

+----+--+--------+ 
| id | | format | 
+----+--+--------+ 
| 1 | |  1 | 
| 2 | |  2 | 
| 3 | |  3 | 
+----+--+--------+ 

То, что я хотел бы добиться того, чтобы отобразить все от "rp_format". Но я также хотел бы сделать чек, чтобы узнать, есть ли «fid» -значение, найденное в «формате».

Пример, который должен отображаться на странице, как это:

fid   recordformat 
1   CD    Remove this format 
2   Vinyl   Remove this format 
3   DVD    Remove this format 

Но давайте говорить «груда» значение найдено в «формате», то я хотел бы, чтобы это будет отображаться как это на странице:

fid   recordformat 
1   CD    Remove this format 
2   Vinyl   Can't remove this format 
3   DVD    Remove this format 

«Удалить этот формат/Не удается удалить этот формат» - это текст, который будет отображаться с помощью проверки «fid» = «format» с использованием PHP.

Вот мой SQL запрос до сих пор:

global $wpdb; 
$rpdb = $wpdb->prefix . 'rp_format'; 
$rpdb2 = $wpdb->prefix . 'rp_records'; 

$sql = " 
SELECT * 
FROM $rpdb 
LEFT OUTER JOIN $rpdb2 ON $rpdb.fid = $rpdb2.format 

UNION 

SELECT * 
FROM $rpdb 
RIGHT OUTER JOIN $rpdb2 ON $rpdb.fid = $rpdb2.format 
WHERE $rpdb.fid IS NOT NULL 
"; 

Проблема у меня с этим запросом является то, что, когда «груда» находится в «формате» (скажем, он находится в 10 раз) каждый из этих 10 будут также выводиться значения.

Как это можно исправить?

Сердечные приветы Йохан

+0

Могли бы вы обновить свой вопрос с полными таблицами, пожалуйста? Это важно для ответа. Вы можете использовать [this] (http://ozh.github.io/ascii-tables/) – marijnz0r

+1

Better @ marijnz0r? :) –

+0

Непонятно, если 'rp_format.fid' находится на' rp_records.format', тогда он должен отображать 'Can not remove this format' else' Удалить этот формат' - это то, чего вы пытаетесь достичь? –

ответ

0

Если я правильно понял, вы хотите отобразить какое-либо сообщение в зависимости от того, существуют ли данные на rp_records или нет и избегать множественного отображения.

Рассмотрим следующий

mysql> select * from rp_format; 
+------+--------------+ 
| fid | recordformat | 
+------+--------------+ 
| 1 | CD   | 
| 2 | Vinyl  | 
| 3 | DVD   | 
| 4 | Test   | 
+------+--------------+ 
4 rows in set (0.00 sec) 

mysql> select * from rp_records; 
+------+--------+ 
| id | format | 
+------+--------+ 
| 1 |  1 | 
| 2 |  2 | 
| 3 |  3 | 
| 4 |  2 | 
| 5 |  1 | 
+------+--------+ 

Так запрос

select 
f.*, 
case 
    when r.format is not null then 'Can\'t remove' else 'Remove this' end 
as message 
from rp_format f 
left join rp_records r on r.format = f.fid 
group by f.fid ; 


+------+--------------+--------------+ 
| fid | recordformat | message  | 
+------+--------------+--------------+ 
| 1 | CD   | Can't remove | 
| 2 | Vinyl  | Can't remove | 
| 3 | DVD   | Can't remove | 
| 4 | Test   | Remove this | 
+------+--------------+--------------+ 
+0

Спасибо! Я не знаю, является ли это наилучшим решением, но я все еще могу использовать его и заставить его работать для моих намерений. : D Я заменил тексты «1» и «2», а PHP сделал так: if ($ result-> message == "1") {// что-то сделать} else {// сделать что-то еще}. Так что это сработало :) –

+0

Рад, что это сработало для вас :) –

0

Не уверен, что я правильно понимаю вашу логику найденными и не нашли формат, если я неправильно - добавить, если условие r.format IS NOT NULL вместо r.format IS NULL. И я думаю, что вам не нужно использовать союз, вы должны использовать присоединиться:

SELECT 
    r.fid, 
    f.recordformat, 
    IF(r.format IS NULL, "Can't remove this format", "Remove this format") 
FROM rp_format f 
LEFT JOIN rp_records r ON f.fid = r.format 
GROUP BY f.fid 
; 

Я уверен, что что-то подобное, это поможет вам!