You may want to try the following:
SELECT t2.name
FROM `table` t1
JOIN `table` t2 ON (t2.data = t1.data)
WHERE t1.name = '$name' AND t1.data != '0';
Test case:
CREATE TABLE `table` (id int, name varchar(10), data varchar(10));
INSERT INTO `table` VALUES (1, 'name1', 'data-a');
INSERT INTO `table` VALUES (2, 'name2', 'data-b');
INSERT INTO `table` VALUES (3, 'name3', 'data-a');
INSERT INTO `table` VALUES (4, 'name4', 'data-b');
INSERT INTO `table` VALUES (5, 'name5', 'data-a');
Result:
SELECT t2.name
FROM `table` t1
JOIN `table` t2 ON (t2.data = t1.data)
WHERE t1.name = 'name2' AND t1.data != '0';
+-------+
| name |
+-------+
| name2 |
| name4 |
+-------+
2 rows in set (0.00 sec)
The nested query solution suggested by @Borealid is another valid solution that returns the same result:
SELECT name
FROM `table`
WHERE data IN (SELECT data FROM `table` WHERE name = 'name2');
+-------+
| name |
+-------+
| name2 |
| name4 |
+-------+
2 rows in set (0.00 sec)